Manera conveniente de analizar los parámetros entrantes multipart / form-data en un Servlet

¿Hay alguna manera conveniente de leer y analizar los datos de la solicitud entrante?

Por ejemplo, el cliente inicia una solicitud posterior

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); 

No puedo obtener el parámetro usando request.getParameter("paramName") . El siguiente código

 BufferedReader reader = new BufferedReader(new InputStreamReader( request.getInputStream())); StringBuilder sb = new StringBuilder(); for (String line; (line = reader.readLine()) != null;) { System.out.println(line); } 

sin embargo, muestra el contenido para mí

 -----------------------------29772313742745 Content-Disposition: form-data; name="name" J.Doe -----------------------------29772313742745 Content-Disposition: form-data; name="email" abuse@spamcop.com -----------------------------29772313742745 

¿Cuál es la mejor manera de analizar la solicitud entrante? No quiero escribir mi propio analizador, probablemente haya una solución lista.

multipart/form-data solicitudes de multipart/form-data encoded no son soportadas por defecto por la API de Servlet antes de la versión 3.0. La API de Servlet analiza los parámetros de forma predeterminada utilizando application/x-www-form-urlencoded encoding. Al usar una encoding diferente, las llamadas a request.getParameter() devolverán null . Cuando ya está en Servlet 3.0 ( Glassfish 3 , Tomcat 7 , etc.), puede utilizar HttpServletRequest#getParts() lugar. También vea este blog para ejemplos extendidos.

Antes de Servlet 3.0, un estándar de facto para analizar solicitudes multipart/form-data utilizaría Apache Commons FileUpload . Simplemente lea cuidadosamente su Guía del usuario y las secciones de Preguntas frecuentes para aprender cómo usarlo. He publicado una respuesta con un ejemplo de código aquí (también contiene un ejemplo de orientación de Servlet 3.0).

Soluciones:

Solución A:

  1. Descargue http://www.servlets.com/cos/index.html
  2. Invoque getParameters () en com.oreilly.servlet.MultipartRequest

Solución B:

  1. Descargar http://jakarta.Apache.org/commons/fileupload/
  2. Invoque readHeaders () en org.apache.commons.fileupload.MultipartStream

Solución C:

  1. Descargue http://users.boone.net/wbrameld/multipartformdata/
  2. Invoque getParameter en com.bigfoot.bugar.servlet.http.MultipartFormData

Solución D:

Usa Struts Struts 1.1 maneja esto automáticamente.

Referencia: http://www.jguru.com/faq/view.jsp?EID=1045507

No siempre hay un servlet antes de una carga (podría usar un filtro, por ejemplo). O podría ser que el mismo controlador (de nuevo un filtro o también un servelt) puede servir para muchas acciones, así que creo que confío en esa configuración de servlet para usar el método getPart (solo para Servlet API> = 3.0), no sé No me gusta

En general, prefiero las soluciones independientes, puedo vivir solo, y en este caso http://commons.apache.org/proper/commons-fileupload/ es uno de eso.

 List 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 } }