Search code examples
javaservletsurlconnection

Convenient way to parse incoming multipart/form-data parameters in a Servlet


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 code

BufferedReader 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.


Solution

  • 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 or newer (Glassfish 3, Tomcat 7, WildFly, etc, all introduced since December 2009 already), then you can use HttpServletRequest#getPart() instead. You can find elaboarate examples in How can I upload files to a server using JSP/Servlet?

    Prior to Servlet 3.0, a de facto standard to parse multipart/form-data requests would be using Apache Commons FileUpload. You'll probably find answers and code examples using this library over all place on the Internet, but this is thus not needed anymore for more than 10 years already. Just use the standard request.getPart(name) method instead.