Estou executando o servidor Jetty 9 (jetty-9.0.5.v20130815) com servlet-api 3.0.1 (javax.servlet: javax.servlet-api: 3.0.1), meu servlet está configurado para aceitar solicitações multipartes.
web.xml –
restapi org.springframework.web.servlet.DispatcherServlet 1 8428800 8428800 1048576
applicationContext.xml –
Ele implementa um comando POST que deve receber um upload de arquivo por meio de HttpServletRequest
. Mas quando request.getParts()
é chamado, esta exceção ocorre:
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)
O cliente é um aplicativo para iOS que usa o ASIFormDataRequest, mas não acho que o cliente tenha o problema porque costumava trabalhar com o Apache commons-fileupload.jar. Eu não estou trocando o servidor para usar o suporte multipart do Jetty para receber arquivos.
Aqui está o pedido, como interceptado por um 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--
Alguma ideia?
Nós tivemos exatamente o mesmo problema, e depois de algumas horas de debugging, encontramos o problema.
O Jetty reclama porque o InputStream que contém a mensagem mulitpart está vazio. O problema para nós era que ambos os multipart do Servlet 3.0 eram configurados (como você fez com as tags multipart-*
no web.xml
), e o Spring foi configurado para usar o Commons FileUpload para análise multipartes. Isso fez com que o Commons FileUpload consumisse o InputStream antes que o Jetty o fizesse no MultiPartInputStreamParser
A solução para isso é simplesmente remover o Commons FileUpload do classpath e configurar o Spring para não usá-lo.
O erro de "Missing content for multipart request"
é devido a um primeiro limite ausente ou mal detectado.
Tem havido numerosos casos de borda (de clientes que formatam mal as mensagens com várias partes) que o Jetty compensa. No entanto, as informações que você forneceu são insuficientes para saber qual é a causa subjacente.
Você pode arquivar um bug em bugs.eclipse.org sob RT / Jetty com uma captura de tráfego do wireshark?
para aplicação de boot de spring eu encontrei o mesmo problema. Eu removi o Commons FileUpload e adicionei às propriedades:
multipart: maxFileSize: 32Mb maxRequestSize: 32Mb
para arquivos de tamanho
No meu caso eu tive o seguinte; quando eu comentei as linhas abaixo em
org.springframework.web.servlet.DispatcherServlet
Funcionou ….. depois de comentar
default org.apache.catalina.servlets.DefaultServlet debug 0 listings false 1 52428800 52428800 0 default *.ico *.png *.jpg *.htc *.gif *.swf *.wmf *.pdf *.css *.js *.json *.otf *.eot *.svg *.ttf *.woff /files/original/* dispatcher org.springframework.web.servlet.DispatcherServlet 2 dispatcher *.html *.txt *.xml /