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

时间:2011-11-08 07:27:09

标签: tomcat servlets file-upload servlet-filters

我想在我的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解析?

2 个答案:

答案 0 :(得分:29)

为了让HttpServletRequest#getParts()能够在Tomcat的Filter中使用,您需要在allowCasualMultipartParsing="true"Webapp/META-INF/context.xml中的webapp <Context>元素中设置Tomcat/conf/server.xml {1}}。

<Context ... allowCasualMultipartParsing="true">

因为根据servlet 3.0规范,HttpServletRequest#getParts()只能在带HttpServlet注释的@MultipartConfig内使用。另请参阅<Context>元素的文档:

  

allowCasualMultipartParsing

     

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

另见:


对具体问题

无关,以下情况绝对不对:

false

首先,您不尊重客户端指定的字符编码 - 如果有的话。其次,二进制文件会失败。

答案 1 :(得分:0)

同时尝试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>