java - receive - servlet multipart
Manera conveniente de analizar los parĂ¡metros entrantes multipart/form-data en un Servlet (3)
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<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
}
}
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo subir archivos al servidor usando JSP / Servlet? 12 respuestas
¿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"
[email protected]
-----------------------------29772313742745
¿Cuál es la mejor manera de analizar la solicitud entrante? No quiero escribir mi propio analizador, probablemente haya una solución lista.
Soluciones:
Solución A:
- Descargue http://www.servlets.com/cos/index.html
- Invoque getParameters () en
com.oreilly.servlet.MultipartRequest
Solución B:
- Descargar http://jakarta.Apache.org/commons/fileupload/
- Invoque readHeaders () en
org.apache.commons.fileupload.MultipartStream
Solución C:
- Descargue http://users.boone.net/wbrameld/multipartformdata/
- 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
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 codificación 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 here (también contiene un ejemplo de orientación de Servlet 3.0).