type servlet receive form example data java http servlets file-upload multipartform-data

java - receive - servlet multipart form data example



ServletFileUpload#parseRequest(solicitud) devuelve una lista vacĂ­a (5)

Estará vacío en ese punto si ya ha analizado (implícitamente) el cuerpo de la solicitud de antemano. El cuerpo de la solicitud HTTP puede leerse / analizarse solo una vez (ya que el cliente lo envió solo una vez y no lo enviará varias veces).

El cuerpo de la solicitud se leerá / analizará implícitamente cuando haya invocado cualquiera de los siguientes métodos antes de enviar la solicitud a Commons FileUpload:

request.getParameter(); request.getParameterMap(); request.getParameterNames(); request.getParameterValues(); request.getReader(); request.getInputStream();

Debe asegurarse de que no está llamando a ninguno de esos métodos de antemano (también verifique todos los filtros de servlet para estar seguro).

Si ya se ha asegurado de que no está haciendo eso, las únicas otras causas posibles serían un encabezado de límite incorrecto y / o usar líneas nuevas incorrectas (realmente tiene que ser CR + LF y, por lo tanto, no solo LF). Puede encontrar un ejemplo concreto y adecuado en la parte inferior de Usar java.net.URLConnection para abrir y gestionar solicitudes HTTP , en la sección "Carga de archivos".

Tengo una aplicación cliente en Android que utiliza HttpURLConnection para enviar archivos al servidor. El servidor utiliza Apache Commons FileUpload API para analizar los valores de los datos del formulario.

El HttpURLConnection envía esta solicitud:

-----------------------------4912995119421 Content-Disposition: form-data; name="deviceid" 9428103 -----------------------------4912995119421 Content-Disposition: form-data; name="countryid" 598 -----------------------------4912995119421 Content-Disposition: form-data; name="number" 98621360 -----------------------------4912995119421 Content-Disposition: form-data; name="file"; filename="2012-12-08 17.42.18.jpg" Content-Type: image/jpeg ÿØÿá1 Exif II* @ ° ª ² ¼ Ä ( 1 Ì 2 Ø i‡ ì %ˆ / n SAMSUNG GT-S5360L H H S5360LUHLB1 2012:12:08 17:42:18 š‚ î ?‚ ö "ˆ ''ˆ È ? 0220? þ ? ‘ ’ & ’ ’ .   0100    @   °   > £ ¤ ¤ ¤ 6 ¤ 2012:12:08 17:42:18 2012:12:08 17:42:18 d R98 0100 ( ¤ T. ÿØÿà JFIF ÿÛ C @@ÿÛ -----------------------------4912995119421--

El código del servidor:

String contentType = request.getContentType(); if ((contentType.indexOf("multipart/form-data") == -1)) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } long maxFileSize = (2 * 1024 * 1024); int maxMemSize = (2 * 1024 * 1024); DiskFileItemFactory factory = new DiskFileItemFactory(); // maximum size that will be stored in memory factory.setSizeThreshold(maxMemSize); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // maximum file size to be uploaded. upload.setSizeMax(maxFileSize); List fileItems = upload.parseRequest(request); Iterator i = fileItems.iterator(); //leo primero todas las variables. int deviceID = 0; int countryID = 0; String phoneNumber = ""; while (i.hasNext()) { FileItem fi = (FileItem) i.next(); if (fi.isFormField()) { String variable = fi.getFieldName(); if (variable.equals("deviceid")) { deviceID = Integer.parseInt(fi.getString()); } else if (variable.equals("countryid")) { countryID = Integer.parseInt(fi.getString()); } else if (variable.equals("number")) { phoneNumber = String.valueOf(Long.parseLong(fi.getString())); } } } if (deviceID == 0 || countryID == 0 || phoneNumber.equals("")) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; }

El problema está en la línea List fileItems = upload.parseRequest(request); . La lista devuelta está vacía y no puedo obtener los valores de datos de formulario.


Me encontré con este problema también, pero no pude encontrar nada específicamente relacionado con la lectura del objeto de solicitud. Finalmente lo tengo que trabajar eliminando este bloque:

@MultipartConfig( location="/tmp", fileSizeThreshold=1024*1024, maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5 )

Aparentemente, cuando intenté leer la solicitud mediante el uso de getParts (), olvidé eliminar esto. Soy un poco nuevo en Java, así que no sabía que esto entra en conflicto con ServletFileUpload # parseRequest. De todos modos, una vez que me deshice de él, el parseRequest devolvió correctamente la matriz.


Si se usa Spring, compruebe si hay un <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /> en un archivo xml. Hay una función

protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException { if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) { if (request instanceof MultipartHttpServletRequest) { logger.debug("Request is already a MultipartHttpServletRequest - if not in a forward, " + "this typically results from an additional MultipartFilter in web.xml"); } else { return this.multipartResolver.resolveMultipart(request); } } // If not returned before: return original request. return request; }

"come" los artículos de varias partes. Causa un dolor de tres horas.


Tuve este mismo problema después de intentarlo. Descubrí que era incompatible con las bibliotecas, el servidor de biblioteca apache con la biblioteca de carga de archivos, por lo que eliminé la biblioteca e importé desde el servidor de la biblioteca Apache.

imports: import org.apache.tomcat.util.http.fileupload.FileItem; import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory; import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

perdon por mi inglés


mi problema es Apache context.xml en mi servidor Linux contiene contexto

allowCasualMultipartParsing="true" y mi HttpServlet contiene

@MultipartConfig(fileSizeThreshold=1024*1024*2,maxFileSize=1024*1024*50,maxRequestSize=1024*1024*50)

Lo elimino y luego funciona correctamente. Espero que esto te ayudará.