【问题标题】:Jetty 11 - Uploading fails only when file is a videoJetty 11 - 仅当文件是视频时上传失败
【发布时间】:2021-09-16 22:01:31
【问题描述】:

我有一个嵌入式码头服务器来处理文件上传。
当上传任何大小任何文件时,文件会正确上传并且请求结束。但是由于某种原因,当上传的文件是视频文件时,jetty 像往常一样启动request.getParts(),但它永远不会结束,并且无限期地保持空闲,最终以超时结束。
我尝试了许多其他文件格式、图像、zip、pdf,它们都很好用。
问题出现在上传特定格式,我不知道它是否真的是因为它们是视频或其他东西,但我从互联网上下载了许多视频样本并尝试将它们上传到码头并且问题出现在例如 .mp4、.3gp 和.mov,但它不适用于 .mkv 文件。

这是码头日志停止前的最后几行:

21:38:08:628 [qtp915349526-16] DEBUG: produceRawContent updated rawContentArrived to 12834785 and firstByteTimeStamp to 109772550050391 AsyncContentProducer@67554002[r=null,t=null,i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8640}]
21:38:08:628 [qtp915349526-16] DEBUG: produceRawContent produced Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null} AsyncContentProducer@67554002[r=null,t=null,i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8640}]
21:38:08:628 [qtp915349526-16] DEBUG: null interceptor, transformed content = raw content AsyncContentProducer@67554002[r=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},t=null,i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8640}]
21:38:08:629 [qtp915349526-16] DEBUG: transformed content is not empty AsyncContentProducer@67554002[r=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},t=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8641}]
21:38:08:629 [qtp915349526-16] DEBUG: returning transformed content AsyncContentProducer@67554002[r=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},t=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8641}]
21:38:08:629 [qtp915349526-16] DEBUG: available = 8192 AsyncContentProducer@67554002[r=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},t=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8641}]
21:38:08:629 [qtp915349526-16] DEBUG: available=8192 HttpInput@1246248597 cs=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0} cp=org.eclipse.jetty.server.BlockingContentProducer@6a92fa25 eof=false
21:38:08:630 [qtp915349526-16] DEBUG: checkMinDataRate [m=0,t=109772550050391] AsyncContentProducer@67554002[r=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},t=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8642}]
21:38:08:630 [qtp915349526-16] DEBUG: nextTransformedContent AsyncContentProducer@67554002[r=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},t=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8642}]
21:38:08:630 [qtp915349526-16] DEBUG: returning transformed content AsyncContentProducer@67554002[r=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},t=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8642}]
21:38:08:631 [qtp915349526-16] DEBUG: nextContent = Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null} AsyncContentProducer@67554002[r=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},t=Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null},i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8643}]
21:38:08:631 [qtp915349526-16] DEBUG: onReadIdle HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0}
21:38:08:631 [qtp915349526-16] DEBUG: nextContent async producer returned Content@714714d8{DirectByteBufferR@48200ff0[p=0,l=8192,c=8192,r=8192]={<<<\x1de.C\x1f\\\x1f]&M+\x95%\x7f\xDf\x03\x8aI\xE4'$\x0e!\xA6\x13...\xBd\xFd\xD9\x9a\xEa<\x93\xC2\xE5ux"vIf"LF\xA2t\x03=:>>>},spc=false,eof=false,err=null}
21:38:08:631 [qtp915349526-16] DEBUG: read produced 8192 byte(s) HttpInput@1246248597 cs=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0} cp=org.eclipse.jetty.server.BlockingContentProducer@6a92fa25 eof=false
21:38:08:632 [qtp915349526-16] DEBUG: reclaim Content@714714d8{DirectByteBufferR@48200ff0[p=8192,l=8192,c=8192,r=0]={\x1de.C\x1f\\\x1f]&...LF\xA2t\x03=:<<<>>>},spc=false,eof=false,err=null} AsyncContentProducer@67554002[r=Content@714714d8{DirectByteBufferR@48200ff0[p=8192,l=8192,c=8192,r=0]={\x1de.C\x1f\\\x1f]&...LF\xA2t\x03=:<<<>>>},spc=false,eof=false,err=null},t=Content@714714d8{DirectByteBufferR@48200ff0[p=8192,l=8192,c=8192,r=0]={\x1de.C\x1f\\\x1f]&...LF\xA2t\x03=:<<<>>>},spc=false,eof=false,err=null},i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8644}]
21:38:08:632 [qtp915349526-16] DEBUG: releaseRequestBuffer HttpConnection@373d0634::SocketChannelEndPoint@ffd712a{l=/127.0.0.1:42069,r=/127.0.0.1:41214,OPEN,fill=-,flush=-,to=5/30000}{io=0/0,kio=0,kro=1}->HttpConnection@373d0634[p=HttpParser{s=CONTENT,12834785 of 13785725},g=HttpGenerator@16634b69{s=START}]=>HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8644}
21:38:08:632 [qtp915349526-16] DEBUG: parseOctetContent(HeapByteBuffer@72ad9ab9[p=0,l=16384,c=16384,r=16384]={<<<N\x15#\xA2\xCa0\x01)\xD9a\x9f\xE8-\x99\x9c\xC5\xF4u\xEf\xE7\xC0\xBfS\xA9\x98...\xBd\xC7\xCc\x9a\x85\x02\x1c\xE5\x13\xBf\xC8qj\xFb}\x06O[\xF1\xE8\xE4)\xDd>>>})
21:38:08:632 [qtp915349526-16] DEBUG: Content=HeapByteBuffer@4aec8a46[p=0,l=16384,c=16384,r=16384]={<<<N\x15#\xA2\xCa0\x01)\xD9a\x9f\xE8-\x99\x9c\xC5\xF4u\xEf\xE7\xC0\xBfS\xA9\x98...\xBd\xC7\xCc\x9a\x85\x02\x1c\xE5\x13\xBf\xC8qj\xFb}\x06O[\xF1\xE8\xE4)\xDd>>>}, Last=false MultiPartParser{s=OCTETS}
21:38:08:633 [qtp915349526-16] DEBUG: nextTransformedContent AsyncContentProducer@67554002[r=null,t=null,i=null,error=false,c=HttpChannelOverHttp@6f3547cb{s=HttpChannelState@18720e7a{s=HANDLING rs=BLOCKING os=OPEN is=IDLE awp=false se=false i=true al=0},r=1,c=false/false,a=HANDLING,uri=http://192.168.1.100/api/v1/files/upload,age=8645}]

这就是我设置多部分配置的方式(它在服务器初始化中):

HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setOutputBufferSize(1024);

ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfig));
connector.setPort(port);

server.addConnector(connector);

ServletHolder jerseyServlet = contextHandler.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/api/v1/*");
jerseyServlet.getRegistration().setMultipartConfig(new MultipartConfigElement("/storage/tmp", -1L, -1L, 1));

让我提醒您,由于现在一切正常,因此文件上传适用于除这些视频文件之外的任何文件。
感谢您的帮助

编辑:

要上传视频,我使用 PostMan 并带有以下标题:

Content-Type:multipart/form-data
X-Auth-Token:{{token}}
X-UserId:{{userid}}
... plus the default postman headers

我还有一个 Angular 应用程序,它使用以下标头执行这些请求(从 chrome 控制台复制粘贴):

Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: en,it-IT;q=0.9,it;q=0.8,en-US;q=0.7
Connection: keep-alive
Content-Length: 13785725
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymajD2TkV6jdqloTj
Host: 192.168.1.100
Origin: http://localhost:4200
Referer: http://localhost:4200/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
X-Auth-Token: mytoken
X-UserId: myuserid

在这两种情况下我得到相同的结果。 只是为了上下文,即使我认为这并不重要,我有一个虚拟机(Ubuntu 20.04)托管接收请求的码头服务器应用程序,并且 Angular 应用程序在我的 Windows 10 PC 上本地运行,在开发服务器中vscode 提供的

【问题讨论】:

  • 你用什么上传视频?请求标头是什么样的? (我们需要更多细节)。最后一条日志显示输出为 OPEN,输入为 IDLE(表示尚未完成,正在等待更多内容)。
  • 嗨,我刚刚按照您的建议编辑了问题,并提供了有关问题的更多详细信息
  • 您使用的是什么版本的邮递员?因为您使用的那个似乎仍然存在带有 Connection: keep-alive 标头的旧错误(使用 HTTP/1.1 时不应发送该标头,仅在使用 HTTP/1.0 时才发送)。
  • 我可以尝试更新一下看看。但是,仍然没有解释我如何在我的角度应用程序中重现该错误。会尝试更新邮递员

标签: java jetty embedded-jetty


【解决方案1】:

13MB 是一个很小的上传大小,Jetty 项目在其单元测试期间上传 1GB、4GB 和 10GB 文件,既可以直接使用POST,也可以使用multipart/form-data

见:https://github.com/eclipse/jetty.project/blob/jetty-11.0.6/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/HugeResourceTest.java

我还使用比 PostMan 更可靠的 http 客户端进行了快速测试。

服务器,运行 Jetty 11.0.6,启用了演示模块。

$ java -jar ~/code/jetty/distros/jetty-home-11.0.6/start.jar 
2021-09-17 14:24:28.360:WARN :oe.jetty:main: demo-realm is deployed. DO NOT USE IN PRODUCTION!
2021-09-17 14:24:28.401:INFO :oejs.Server:main: jetty-11.0.6; built: 2021-06-29T16:16:33.537Z; git: 69469432898becda3aed32a32d4b0adbb7b6daee; jvm 11.0.12+7
2021-09-17 14:24:28.437:INFO :oejdp.ScanningAppProvider:main: Deployment monitor [file:///home/joakim/code/jetty/distros/bases/base11-demos/webapps/]
2021-09-17 14:24:28.813:WARN :oejshC.ROOT:main: The test-jetty webapp is deployed. DO NOT USE IN PRODUCTION!
2021-09-17 14:24:28.957:INFO :oejss.DefaultSessionIdManager:main: Session workerName=node0
2021-09-17 14:24:29.022:INFO :oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@2609b277{Test WebApp,/,file:///home/joakim/code/jetty/distros/bases/base11-demos/work/jetty-0_0_0_0-8080-ROOT_war-_-any-/webapp/,AVAILABLE}{/home/joakim/code/jetty/distros/bases/base11-demos/webapps/ROOT.war}
2021-09-17 14:24:29.182:WARN :oejshC.test:main: The test-jetty webapp is deployed. DO NOT USE IN PRODUCTION!
2021-09-17 14:24:29.246:INFO :oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@e6516e{Test WebApp,/test,file:///home/joakim/code/jetty/distros/bases/base11-demos/work/jetty-0_0_0_0-8080-demo-jetty_war-_test-any-/webapp/,AVAILABLE}{/home/joakim/code/jetty/distros/bases/base11-demos/webapps/demo-jetty.war}
2021-09-17 14:24:29.255:INFO :oejs.AbstractConnector:main: Started ServerConnector@4e9658b5{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2021-09-17 14:24:29.267:INFO :oejs.Server:main: Started Server@51891008{STARTING}[11.0.6,sto=5000] @1561ms

接下来,我要测试上传的文件...

$ ls -la security-cam.mp4 
-rw-rw-r-- 1 joakim joakim 2394313303 Sep 17 14:23 security-cam.mp4
$ file security-cam.mp4 
security-cam.mp4: ISO Media, MP4 v2 [ISO 14496-14]

这是 2.4GB

让我们使用 curl 上传,多部分,不带 Expect: 100-Continue(如您的标题所示)

$ curl --verbose \
  --output multipart-response.html \
  --form file=@security-cam.mp4 \
  --header "Expect: " \
  http://localhost:8080/dump/info
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /dump/info HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.68.0
> Accept: */*
> Content-Length: 2394313511
> Content-Type: multipart/form-data; boundary=------------------------b3d2869d036926f9
> 
} [65536 bytes data]
 88 2283M    0     0   88 2016M      0  1006M  0:00:02  0:00:02 --:--:-- 1005M* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Set-Cookie: JSESSIONID=node03eutgygnhty4ltv47atz8yfb12.node0; Path=/
< Expires: Thu, 01 Jan 1970 00:00:00 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 10721
< Server: Jetty(11.0.6)
< 
{ [10721 bytes data]
100 2283M  100 10721  100 2283M   4704  1001M  0:00:02  0:00:02 --:--:-- 1001M
* Connection #0 to host localhost left intact

因此它发送了 2.4GB 并收到了包含有关请求的一些详细信息的 html 响应,并使用 HttpServletRequest.getParts() 解析了整个请求正文内容,来自单个 javax.servlet.http.Part 的结果如下所示...

$ html2text multipart-response.html | grep -A5 "Parts"
Parts:
        Part{n=file,fn=security-cam.mp4,ct=application/octet-
    file: stream,s=2394313303,tmp=true,file=/home/joakim/code/jetty/distros/bases/
        base11-demos/work/jetty-0_0_0_0-8080-ROOT_war-_-any-/upload/
        MultiPart7325738426025573814}

是的,所有 2.4GB 都被 Servlet 视为上传。

它们是一样的吗?都上传没有问题吗?

[client]$ sha1sum security-cam.mp4 
85454d56bc8315fa0484d4d5a9cb9ad54933fbab  security-cam.mp4
[client]$ sha1sum /home/joakim/code/jetty/distros/bases/base11-demos/work/jetty-0_0_0_0-8080-ROOT_war-_-any-/upload/MultiPart7325738426025573814
85454d56bc8315fa0484d4d5a9cb9ad54933fbab  /home/joakim/code/jetty/distros/bases/base11-demos/work/jetty-0_0_0_0-8080-ROOT_war-_-any-/upload/MultiPart7325738426025573814

是的,相同的文件、大小和内容。

此时问题似乎不在 Jetty 中。 也许泽西岛?还是更可能是邮递员?

如果您可以在一个小型测试用例中复制此问题,您可以尝试通过https://github.com/eclipse/jetty.project/issues 联系 Jetty 开发人员并提供该复制用例,我们或许能够缩小您的第 3 方库中存在问题的范围。

【讨论】:

  • 感谢您提供的许多详细信息。原来我有两个问题...第一个问题与标头以及我如何执行请求有关,这没什么大不了的,但是由于您的提示,我解决了它,可能码头不是问题。第二个问题与 jetty 或 http 完全无关,但我有一个用于生成文件缩略图的第三方库,由于某种原因,在我的请求结束时为 mp4 文件创建缩略图时,它会卡住(所以得到我的请求卡住)。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2015-01-20
  • 2017-02-19
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2012-05-21
相关资源
最近更新 更多