我想在我的JSF应用程序中上传文件。我正在使用Filter和HttpServletRequestWrapper访问上载文件。
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()返回一个空集合。如何multipart/form-data在Tomcat7.0.8中的Servlet过滤器中启用解析?
getParts()
multipart/form-data
为了获得HttpServletRequest#getParts()在一个工作Filter在Tomcat中,您需要设置allowCasualMultipartParsing="true"在webapp的<Context>元素Webapp/META-INF/context.xml或Tomcat/conf/server.xml。
HttpServletRequest#getParts()
allowCasualMultipartParsing="true"
<Context>
Webapp/META-INF/context.xml
Tomcat/conf/server.xml
<Context ... allowCasualMultipartParsing="true">
因为根据Servlet3.0规范,该HttpServletRequest#getParts()属性只能在HttpServlet带有@MultipartConfig注释的内使用。另请参阅<Context>元素的文档:
HttpServlet
@MultipartConfig
allowCasualMultipartParsing 设置为trueTomcat是否应multipart/form- data在调用HttpServletRequest.getPart*或时自动解析请求主体HttpServletRequest.getParameter*,即使目标servlet没有标注@MultipartConfig注释(有关详细信息,请参见Servlet Specification 3.0,第3.2节)。请注意,除了设置以外,任何其他设置false都会导致Tomcat的行为在技术上不符合规范。默认值为false。
allowCasualMultipartParsing
设置为trueTomcat是否应multipart/form- data在调用HttpServletRequest.getPart*或时自动解析请求主体HttpServletRequest.getParameter*,即使目标servlet没有标注@MultipartConfig注释(有关详细信息,请参见Servlet Specification 3.0,第3.2节)。请注意,除了设置以外,任何其他设置false都会导致Tomcat的行为在技术上不符合规范。默认值为false。
true
multipart/form- data
HttpServletRequest.getPart*
HttpServletRequest.getParameter*
false
与 具体问题 无关 ,以下绝对不正确:
byte[] b = new byte[(int) p.getSize()]; p.getInputStream().read(b); params.put(p.getName(), new String[]{new String(b)});
首先,您不遵守客户端指定的字符编码-如果有的话。其次,这对于二进制文件将失败。