java file-upload jetty multipartform-data servlet-3.0

java - Jetty lanza "Falta contenido para solicitudes múltiples" en solicitud de formulario multiparte



file-upload multipartform-data (4)

Estoy ejecutando el servidor Jetty 9 (jetty-9.0.5.v20130815) con servlet-api 3.0.1 (javax.servlet: javax.servlet-api: 3.0.1), mi servlet está configurado para aceptar solicitudes de varias partes.

web.xml -

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fmt="http://java.sun.com/jsp/jstl/fmt" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"> <servlet> <servlet-name>restapi</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> <multipart-form enable="true" /> <multipart-config> <max-file-size>8428800</max-file-size> <max-request-size>8428800</max-request-size> <file-size-threshold>1048576</file-size-threshold> </multipart-config> </servlet> </web-app>

applicationContext.xml -

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- one of the properties available; the maximum file size in bytes --> <property name="maxUploadSize" value="8000000"/> </bean>

Implementa un comando POST que debe recibir una carga de archivo a través de HttpServletRequest . Pero cuando se llama a request.getParts() , se produce esta excepción:

java.io.IOException: Missing content for multipart request at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:493) at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:401) at org.eclipse.jetty.server.Request.getParts(Request.java:2077) at javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:351) at javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:351)

El cliente es una aplicación de iOS que usa ASIFormDataRequest, pero no creo que ese cliente tenga el problema porque solía trabajar con Apache commons-fileupload.jar. No estoy cambiando el servidor para usar el soporte multiparte de Jetty para recibir archivos.

Aquí está la solicitud, interceptada por un proxy:

POST /mycommand HTTP/1.1 Host: localhost:8080 Proxy-Connection: close Accept-Encoding: gzip Content-Type: multipart/form-data; charset=utf-8; boundary=0xKhTmLbOuNdArY-849F4DA3-85DC-46F1-B182-44257808F0B9 Content-Length: 1568 Connection: close --0xKhTmLbOuNdArY-849F4DA3-85DC-46F1-B182-44257808F0B9 Content-Disposition: form-data; name="param1" text --0xKhTmLbOuNdArY-849F4DA3-85DC-46F1-B182-44257808F0B9 Content-Disposition: form-data; name="data"; filename="file" Content-Type: application/octet-stream ... DATA ... --0xKhTmLbOuNdArY-849F4DA3-85DC-46F1-B182-44257808F0B9--

¿Algunas ideas?



Tuvimos exactamente el mismo problema, y ​​después de algunas horas de depuración encontramos el problema.

Jetty se queja porque el InputStream que contiene el mensaje mulitpart está vacío. El problema para nosotros fue que tanto la versión múltiple del Servlet 3.0 como la configurada (como lo ha hecho con las etiquetas multipart-* en web.xml ), y Spring se configuró para usar Commons FileUpload para el análisis de varias partes. Esto provocó que Commons FileUpload consuma el InputStream antes de que Jetty lo hiciera en el MultiPartInputStreamParser

La solución a esto es simplemente eliminar Commons FileUpload de classpath y configurar Spring para que no lo use.


para la aplicación de arranque de primavera encontré el mismo problema. Elimino Commons FileUpload lib y lo agrego a las propiedades:

multipart: maxFileSize: 32Mb maxRequestSize: 32Mb

para archivos de tamaño


En mi caso, tuve lo siguiente; cuando comenté las líneas a continuación en

org.springframework.web.servlet.DispatcherServlet

Funcionó ..... después de comentar

<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> <multipart-config> <!-- 52MB max --> <max-file-size>52428800</max-file-size> <max-request-size>52428800</max-request-size> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ico</url-pattern> <url-pattern>*.png</url-pattern> <url-pattern>*.jpg</url-pattern> <url-pattern>*.htc</url-pattern> <url-pattern>*.gif</url-pattern> <url-pattern>*.swf</url-pattern> <url-pattern>*.wmf</url-pattern> <url-pattern>*.pdf</url-pattern> <url-pattern>*.css</url-pattern> <url-pattern>*.js</url-pattern> <url-pattern>*.json</url-pattern> <url-pattern>*.otf</url-pattern> <url-pattern>*.eot</url-pattern> <url-pattern>*.svg</url-pattern> <url-pattern>*.ttf</url-pattern> <url-pattern>*.woff</url-pattern> <url-pattern>/files/original/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>2</load-on-startup> <!-- <multipart-config> 52MB max <max-file-size>52428800</max-file-size> <max-request-size>52428800</max-request-size> <file-size-threshold>0</file-size-threshold> </multipart-config>--> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.html</url-pattern> <url-pattern>*.txt</url-pattern> <url-pattern>*.xml</url-pattern> <url-pattern>/</url-pattern> </servlet-mapping>