Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在文件上载时绕过struts2拦截器_Java_Jsp_File Upload_Struts2_Interceptorstack - Fatal编程技术网

Java 如何在文件上载时绕过struts2拦截器

Java 如何在文件上载时绕过struts2拦截器,java,jsp,file-upload,struts2,interceptorstack,Java,Jsp,File Upload,Struts2,Interceptorstack,我编写了一个简单的页面,其中包含一个上传文件的表单和一个处理该文件的jsp 我的问题是,当上传文件时,请求对象由Struts拦截器处理,当它到达jsp页面时,它已经被“消耗”,因此使用“ServletFileUpload.parseRequest()”等方法读取请求的调用返回空列表 我已经找到了一个可行的解决方案,但这需要重新启动Tomcat,而且由于该页面必须添加到生产服务器上,因此如果有办法不重新启动它,效果会更好 现在,我尝试和工作的是: 1) 在struts.xml中,我添加了 2)

我编写了一个简单的页面,其中包含一个上传文件的表单和一个处理该文件的jsp

我的问题是,当上传文件时,请求对象由Struts拦截器处理,当它到达jsp页面时,它已经被“消耗”,因此使用“ServletFileUpload.parseRequest()”等方法读取请求的调用返回空列表

我已经找到了一个可行的解决方案,但这需要重新启动Tomcat,而且由于该页面必须添加到生产服务器上,因此如果有办法不重新启动它,效果会更好

现在,我尝试和工作的是:
1) 在struts.xml中,我添加了


2) 我在struts-custom.xml中写道:


有了它,我可以绕过struts拦截器上传文件

是否有更好/更清洁的解决方案?正如我所说,最好的解决方案是不需要重新启动应用服务器

即使我不认为问题与代码有关,我也会发布它

page.html:

<form action="upload.jsp" method="post" enctype="multipart/form-data" TARGET="Report_Down"
onSubmit="if(document.getElementById('file1').value == '') return false;">
    Input File <input type="file" name="file1" id="file1">
    <input type="submit" value="Upload">
</form>
提前感谢:)

您对使用请求的意思是什么?请求通过拦截器堆栈到达操作,并且仍然存在。
如果出于某种原因(在执行简单的文件上传时,您不应该有一个),您需要在框架机制(操作、拦截器等)之外运行代码,那么您可以使用Servlet

顺便说一下,你的问题主要与

  • 最大文件/请求上限命中率
  • 拦截器堆栈的错误定义
  • 我打赌是n.1,但如果这仍然没有解决您的问题,请发布关于struts.xml的更多详细信息


    还请记住避免使用Scriptlet(正如Boris已经建议的那样),并且不要直接调用JSP:总是通过一个动作传递。。。脚本?哇!非常喜欢Java5。好的,你的实际代码在哪里?我的意思是——很明显,你在2016年是对的……你会惊讶地知道,在这台服务器上,我们已经实现了JDK 6的安装,但最近Java EE 1.2(1999)中引入了JSP,taglibs随后又在Java EE 1.3(2001)中加入。Sriptlet几乎立刻被认为是极其糟糕的做法。我怀疑这个网站上是否有很多人在2005年后的制作中写过剧本。简言之,在这方面获得帮助将是一件棘手的事情,因为它已经过时了。事实上,您的“新”代码不应该使用Scriptlet。为什么要手动解析请求?谢谢您的回答。我知道这是一种可怕的做法,但问题是我想绕过Struts,所以我不想通过操作。我可以请求重新启动Tomcat,但我不能添加新操作,因为这需要升级webapp的已部署jar,而且不能在短时间内完成。.Mettiti di traverso,nel 2016 nun se pòvede':(:@
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    
    if (!isMultipart) {
        return;
    }
    
    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(1024 * 1024 * 2);
    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
    String uploadFolder = getServletContext().getRealPath("")
            + File.separator + DATA_DIRECTORY;
    
    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setSizeMax(1024 * 1024);
    
    try {
        List items = upload.parseRequest(request);
    
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
    
            if (!item.isFormField()) {
                try {
                    String fileName = new File(item.getName()).getName();
                    String filePath = uploadFolder + File.separator + fileName;
                    File uploadedFile = new File(filePath);
                    item.write(uploadedFile);
    
                    //do something...
                }
                catch(Exception e) {
                    //...
                }
            }
        }
    
    getServletContext().getRequestDispatcher(forwardUrl).forward(
                request, response);
    
    } catch (FileUploadException ex) {
        throw new ServletException(ex);
    } catch (Exception ex) {
        throw new ServletException(ex);
    }