I would like to upload a file in my JSF application. I am using a Filter
and HttpServletRequestWrapper
to access the upload file.
Also try Multipart filter. worked for me.
<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>
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:
allowCasualMultipartParsing
Set to
true
if Tomcat should automatically parsemultipart/form-data
request bodies whenHttpServletRequest.getPart*
orHttpServletRequest.getParameter*
is called, even when the target servlet isn't marked with the@MultipartConfig
annotation (See Servlet Specification 3.0, Section 3.2 for details). Note that any setting other thanfalse
causes 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.