如何在 Tomcat 上运行的 servlet 过滤器中使用 HttpServletRequest#getParts()?

Posted

技术标签:

【中文标题】如何在 Tomcat 上运行的 servlet 过滤器中使用 HttpServletRequest#getParts()?【英文标题】:How to use HttpServletRequest#getParts() in a servlet filter running on Tomcat? 【发布时间】:2011-12-24 05:36:30 【问题描述】:

我想在我的 JSF 应用程序中上传一个文件。我正在使用FilterHttpServletRequestWrapper 来访问上传文件。

 public MultipartRequestWrapper(HttpServletRequest request) 
    super(request);
    System.out.println("Created multipart wrapper....");
    try 
        System.out.println("Looping parts"+getParts().size());

        for (Part p : getParts()) 
            System.out.println(String.format("Part name: %1$s, contentType : %2$s", p.getName(), p.getContentType()));
            for(String header : p.getHeaderNames())
                System.out.println("Header name : " + header + ", value : " + p.getHeader(header));
            
            byte[] b = new byte[(int) p.getSize()];
            p.getInputStream().read(b);
            params.put(p.getName(), new String[]new String(b));
        
     catch (IOException ex) 
        ex.printStackTrace();
        Logger.getLogger(MultipartRequestWrapper.class.getName()).log(Level.SEVERE, null, ex);
     catch (ServletException ex) 
         ex.printStackTrace();
        Logger.getLogger(MultipartRequestWrapper.class.getName()).log(Level.SEVERE, null, ex);
    

但是,getParts() 返回一个空集合。如何在 Tomcat 7.0.8 的 servlet 过滤器中启用 multipart/form-data 解析?

【问题讨论】:

【参考方案1】:

为了让HttpServletRequest#getParts() 在Tomcat 中的Filter 中工作,您需要在Webapp/META-INF/context.xmlTomcat/conf/server.xml 中webapp 的<Context> 元素中设置allowCasualMultipartParsing="true"

<Context ... allowCasualMultipartParsing="true">

因为根据 servlet 3.0 规范,HttpServletRequest#getParts() 应该只能在带有 @MultipartConfig 注释的 HttpServlet 内可用。另请参阅&lt;Context&gt; 元素的文档:

allowCasualMultipartParsing

如果 Tomcat 应该在调用 HttpServletRequest.getPart*HttpServletRequest.getParameter* 时自动解析 multipart/form-data 请求主体,则设置为 true,即使目标 servlet 未使用 @MultipartConfig 注释标记(参见 Servlet 规范 3.0,详细信息见第 3.2 节)。请注意,false 以外的任何设置都会导致 Tomcat 以不符合技术规范的方式运行。默认为false

另见:

Tomcat 7 issue 49711 Uploading files in Servlet 3.0 Uploading files in JSF 2.0 and Servlet 3.0

与具体问题无关,下面的肯定是不对的:

byte[] b = new byte[(int) p.getSize()];
p.getInputStream().read(b);
params.put(p.getName(), new String[]new String(b));

首先,您没有遵守客户端指定的字符编码(如果有)。其次,这对于二进制文件会失败。

【讨论】:

我正在使用 tomcat 7.0.33 我正在使用 apache commons fileupload 并且如上所述在 Tomcat/conf/context.xml 中进行了更改,但它对我不起作用。请帮忙 @Mayank:这个问题/答案与 Apache Commons FileUpload 无关。这是关于新的 Servlet 3.0 内置 multipart/form-data 解析器。此 Tomcat 配置设置与 Apache Commons FileUpload 完全无关。您的具体问题是在其他地方引起的。如果您仍然卡住,只需按。同时,这个答案可能会有所帮助:***.com/questions/2422468/… 感谢您的快速回复,但我对我的问题有点困惑,因为多部分请求被 tomcat 自动取消。甚至没有调用servelt init。请问有什么建议吗? Wildfly下是否有类似的方案可以通过过滤器开启上传?【参考方案2】:

也可以试试 Multipart 过滤器。为我工作。

<filter>
    <filter-name>MultipartFilter</filter-name>
    <filter-class>org.eclipse.jetty.servlets.MultiPartFilter</filter-class>
</filter> 
<filter-mapping>
    <filter-name>MultipartFilter</filter-name>
    <servlet-name>CamelServlet</servlet-name> 
</filter-mapping>

【讨论】:

以上是关于如何在 Tomcat 上运行的 servlet 过滤器中使用 HttpServletRequest#getParts()?的主要内容,如果未能解决你的问题,请参考以下文章

Gwt servlet 在 tomcat 上失败

IDEA 配置Tomcat运行Servlet项目

如何在 Glassfish 上运行 Tutorialpoint 的 Servlet 发布示例? [复制]

Tomcat 上的 Java servlet 出现 404 错误,但在 localhost 上运行良好

java 一个tomcat上可以装几个网站?几个war?几个servlet?

如何创建一个 java servlet 程序并使用 XAMPP Tomcat 运行它?