当前位置: 首页 > 知识库问答 >
问题:

Struts2上载超过最大大小,但不能引发任何异常

邓才
2023-03-14

我现在正在学习上传拦截器。该文档称,所有上传文件大小超过常量值“struts.multipart.max大小”将在后台引发异常,并且视图将转到INPUT视图。但是,在我的情况下,它不能抛出任何异常,并且视图没有转到INPUT视图(上传进度一直是0%,见图)。

这是我上传的html

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>HELLO!${session.user }</h1>
    <div align="center">
        <s:form method="post" enctype="multipart/form-data" action="upload">
        <s:fielderror></s:fielderror>
        <s:file label="上传文件" name="upload" />
        <s:file label="上传文件" name="upload" />
        <s:file label="上传文件" name="upload" />
        <s:submit />
        </s:form>
    </div>
</body>
</html>

这是我行动的准则

package com.aks.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.List;
import java.util.UUID;


import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport{


    /**
     * 
     */
    private static final long serialVersionUID = -6671906825564499267L;

    private static final int BUFFER_SIZE = 4096;

    private List<File> upload;
    private List<String> uploadFileName;
    private List<String> uploadContentType;
    private String savePath;

    public String getSavePath() {
        return ServletActionContext.getRequest().getServletContext().getRealPath(this.savePath);
    }


    public void setSavePath(String savePath) {
        this.savePath = savePath;
    }


    public List<File> getUpload() {
        return upload;
    }


    public void setUpload(List<File> upload) {
        this.upload = upload;
    }


    public List<String> getUploadFileName() {
        return uploadFileName;
    }


    public void setUploadFileName(List<String> uploadFileName) {
        this.uploadFileName = uploadFileName;
    }


    public List<String> getUploadContentType() {
        return uploadContentType;
    }


    public void setUploadContentType(List<String> uploadContentType) {
        this.uploadContentType = uploadContentType;
    }


    @Override
    public String execute() throws Exception {
        String newFileName = (UUID.randomUUID() + uploadFileName.get(0).substring(uploadFileName.get(0).lastIndexOf(".")));
        System.out.println(newFileName);
        System.out.println(getSavePath());
        FileInputStream fis = new FileInputStream(upload.get(0));
        FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + newFileName);
        System.out.println(getSavePath());
        FileChannel fcIn = fis.getChannel();
        FileChannel fcOut = fos.getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
        while(true){
            buffer.clear();
            int r = fcIn.read(buffer);
            if(r == -1){
                break;
            }
            buffer.flip();
            fcOut.write(buffer);
        }
        getUploadFileName().set(0, newFileName);
        fcIn.close();
        fcOut.close();
        fis.close();
        fos.close();
        return SUCCESS;
    }
}

这是结果html

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>显示上传图片</title>
</head>
<body>
    <img src="upload/${uploadFileName['0']} " />
    <s:debug></s:debug>
</body>
</html>

最后,这是这次行动的struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.multipart.maxSize" value="100000000" /> <!-- 20MB -->
    <constant name="struts.multipart.saveDir" value="/temp" />

    <package name="default" namespace="/" extends="struts-default">
        <action name="index">
            <result name="success">index.jsp</result>
        </action>
        <action name="login" class="com.aks.action.LoginAction">
            <result name="input">index.jsp</result>
            <result name="success">/WEB-INF/jsp/welcome.jsp</result>
            <result name="error">/WEB-INF/jsp/error.jsp</result>
        </action>
        <action name="upload" class="com.aks.action.UploadAction">
            <interceptor-ref name="defaultStack">
                <param name="fileUpload.allowedTypes">image/png,image/jpeg,application/x-zip-compressed,application/octet-stream</param>
                <param name="fileUpload.maximumSize">90000000</param>
            </interceptor-ref>
            <param name="savePath">/upload</param>
            <result name="input">index.jsp</result>
            <result name="success">/WEB-INF/jsp/showImage.jsp</result>
            <result name="error">/WEB-INF/jsp/error.jsp</result>
        </action>
    </package>


    <!-- Add packages here -->

</struts>

我的开发环境:eclipse4.5.1 tomcat8 jdk1.8 struts2.3.24

为什么不能抛出异常,为什么不去输入视图?

共有1个答案

邵骏喆
2023-03-14

这是一个已知的问题,在这个答案中进行了分析,并且(正如您在更新中所看到的),它已经在Struts2.3.18中得到了“修补”。

只需升级到2.3.24.1并使用jakarta-stream作为多部分解析器。

 类似资料:
  • Spring启动应用程序。我有一个用于上传多部分文件的Restendpoint。 Spring boot版本为2.0.6。我尝试了以下方法。 1) spring:tomcat:最大http表单post大小:500MB最大swallow大小:500MB 2) spring:servlet:多部分:最大文件大小:500MB最大请求大小:500MB已启用:true 3) spring:servlet:多

  • 我正在用Spring Boot 2.1.3(使用标准的Tomcat嵌入式web服务器)开发一个endpoint来上载图像,我想限制多部分上载的大小。我可以通过以下属性轻松完成此操作: 但是我总是得到Spring无法捕获的500,因为Tomcat正在抛出异常并且请求无法到达我在RestController中的代码。 我的ExceptionHandler是这样的,但无论注释中出现什么异常,它显然都不起

  • 我有一个WordPress网络站点(目前只有一个页面)。最大的问题是,WordPress中媒体的最大上传大小限制为1MB。 我增加这一限制的任何尝试都没有成功。 到目前为止,我所尝试的: 增加upload_max_filesize和post_max_size 服务器重新加载php。ini在特定时间段内自动生成。通过运行phpinfo(),php确认了该更改。 WordPress插件(Revo Sl

  • 对于我的节点应用程序,我有一个运行在Debian上的服务器(app.js),它使用socket.io向我的客户机(index.html)提供html和websocket数据。我正在尝试制作一个回合制的HTML5多人游戏。 在使用socket.emit()/io.emit()和socket.on()成功执行了多次数据传输后,我的服务器在socket.emit()调用上崩溃,出现错误 “events.

  • //{this.props.params.item}来自反应路由器(路径('/detail/item/id')) 为什么我的调度是无限循环,直到出错(超过最大调用堆栈大小)

  • 我的表: 插入查询: 我的页面大小是16KB。因此,我的表中的一行最多可以包含8192字节(即8KB)。 我创建了11个列(每个255个字符),其中这11列最多可以容纳字符。 如果我存储2805-3字节的字符,它将需要(