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?
El error de "Missing content for multipart request"
se debe a un primer límite faltante o mal detectado.
Ha habido numerosos casos extremos (de clientes que mal formatean mensajes de varias partes) que compensa Jetty. Sin embargo, la información que ha proporcionado es insuficiente para saber cuál puede ser la causa subyacente.
¿Puedes archivar un error en bugs.eclipse.org bajo RT / Jetty con una captura del tráfico de wireshark?
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>