Convenient way to parse incoming multipart/form-data parameters in a Servlet
Solution 1
multipart/form-data
encoded requests are indeed not by default supported by the Servlet API prior to version 3.0. The Servlet API parses the parameters by default using application/x-www-form-urlencoded
encoding. When using a different encoding, the request.getParameter()
calls will all return null
. When you're already on Servlet 3.0 (Glassfish 3, Tomcat 7, etc), then you can use HttpServletRequest#getParts()
instead. Also see this blog for extended examples.
Prior to Servlet 3.0, a de facto standard to parse multipart/form-data
requests would be using Apache Commons FileUpload. Just carefully read its User Guide and Frequently Asked Questions sections to learn how to use it. I've posted an answer with a code example before here (it also contains an example targeting Servlet 3.0).
Solution 2
Solutions:
Solution A:
- Download http://www.servlets.com/cos/index.html
- Invoke getParameters() on
com.oreilly.servlet.MultipartRequest
Solution B:
- Download http://jakarta.Apache.org/commons/fileupload/
- Invoke readHeaders() in
org.apache.commons.fileupload.MultipartStream
Solution C:
- Download http://users.boone.net/wbrameld/multipartformdata/
- Invoke getParameter on com.bigfoot.bugar.servlet.http.MultipartFormData
Solution D:
Use Struts. Struts 1.1 handles this automatically.
Reference: http://www.jguru.com/faq/view.jsp?EID=1045507
Solution 3
Not always there's a servlet before of an upload (I could use a filter for example). Or could be that the same controller ( again a filter or also a servelt ) can serve many actions, so I think that rely on that servlet configuration to use the getPart method (only for Servlet API >= 3.0), I don't know, I don't like.
In general, I prefer independent solutions, able to live alone, and in this case http://commons.apache.org/proper/commons-fileupload/ is one of that.
List<FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : multiparts) {
if (!item.isFormField()) {
//your operations on file
} else {
String name = item.getFieldName();
String value = item.getString();
//you operations on paramters
}
}
atuser
Updated on July 08, 2022Comments
-
atuser almost 2 years
Is there any convenient way to read and parse data from incoming request.
E.g client initiate post request
URLConnection connection = new URL(url).openConnection(); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); PrintWriter writer = null; try { OutputStream output = connection.getOutputStream(); writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important! // Send normal param. writer.println("--" + boundary); writer.println("Content-Disposition: form-data; name=\"param\""); writer.println("Content-Type: text/plain; charset=" + charset); writer.println(); writer.println(param);
I’m not able to get param using
request.getParameter("paramName")
. The following codeBufferedReader reader = new BufferedReader(new InputStreamReader( request.getInputStream())); StringBuilder sb = new StringBuilder(); for (String line; (line = reader.readLine()) != null;) { System.out.println(line); }
however displays the content for me
-----------------------------29772313742745 Content-Disposition: form-data; name="name" J.Doe -----------------------------29772313742745 Content-Disposition: form-data; name="email" [email protected] -----------------------------29772313742745
What is the best way to parse incoming request? I don’t want to write my own parser, probably there is a ready solution.
-
Cheruvim over 10 yearsBe careful. Some of the documentation on the apache site is wrong. For example they says that you can call setRepository() on a FileItemFactory object which is false because any Object that implements FileItemFactory has only one method: createItem(). So be sure you read the javadocs as well.
-
Jafar Ali about 10 yearsPlease put up some solutions as this links can get absolete any time in future. This will attract negative rating.
-
basZero over 7 years
getParts()
always returns zero items. Why is it so hard to retrieve multipart forms in Java and Servlet 3.0? Can't believe it! -
BalusC over 7 years@basZero: the answer to the duplicate question already explains when it would be empty.
-
basZero over 7 years@BalusC do you have a link? It's quite a lot of info here on this page
-
Ak S over 5 yearsit works only when you have a request object. But what in case of stream object or any other Object data?
-
Luca Rasconi over 5 yearsThe stream or any other object data will replace the request. So I would parse/read the stream or whatever in order to get the multipart form data. Anyway do you have any real example?