【发布时间】: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