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

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

 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 解析?

【问题讨论】:

    标签: tomcat servlets file-upload servlet-filters


    【解决方案1】:

    为了让HttpServletRequest#getParts() 在Tomcat 中的Filter 中工作,您需要在Webapp/META-INF/context.xml 或Tomcat/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。

    另见:


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

    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 完全无关。您的具体问题是在其他地方引起的。如果您仍然卡住,只需按。同时,这个答案可能会有所帮助:stackoverflow.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>
    

    【讨论】:

      猜你喜欢
      • 2011-04-09
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2011-03-24
      • 2017-12-20
      • 2019-08-03
      相关资源
      最近更新 更多