如何在 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 应用程序中上传一个文件。我正在使用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
解析?
【问题讨论】:
【参考方案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
内可用。另请参阅<Context>
元素的文档:
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()?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Glassfish 上运行 Tutorialpoint 的 Servlet 发布示例? [复制]
Tomcat 上的 Java servlet 出现 404 错误,但在 localhost 上运行良好