I would like to upload a file in my JSF application. I am using a Filter and HttpServletRequestWrapper to access the upload file.
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);
}
However, getParts() returns an empty collection. How can I enable multipart/form-data parsing in a servlet filter in Tomcat 7.0.8?
In order to get HttpServletRequest#getParts() to work in a Filter in Tomcat, you need to set allowCasualMultipartParsing="true" in the webapp's <Context> element in Webapp/META-INF/context.xml or Tomcat/conf/server.xml.
<Context ... allowCasualMultipartParsing="true">
Because as per the servlet 3.0 specification the HttpServletRequest#getParts() should only be available inside a HttpServlet with the @MultipartConfig annotation. See also the documentation of the <Context> element:
allowCasualMultipartParsingSet to
trueif Tomcat should automatically parsemultipart/form-datarequest bodies whenHttpServletRequest.getPart*orHttpServletRequest.getParameter*is called, even when the target servlet isn't marked with the@MultipartConfigannotation (See Servlet Specification 3.0, Section 3.2 for details). Note that any setting other thanfalsecauses Tomcat to behave in a way that is not technically spec-compliant. The default isfalse.
Unrelated to the concrete problem, the following is definitely not right:
byte[] b = new byte[(int) p.getSize()];
p.getInputStream().read(b);
params.put(p.getName(), new String[]{new String(b)});
First, you are not respecting the character encoding specified by the client -if any. Second, this will fail for binary files.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With