使用 scalatra 服务器发送大文件在 2^31 - 1 字节后结束
sending large files with scalatra server ends after 2^31 - 1 bytes
我们将 scalatra 与 Jetty 9 一起使用。我们有一个服务于静态文件的端点。但我注意到任何大于 2GB 的东西似乎都会被截断。我可以看到文件被分块发送。 curl 和 wget 可以正确地开始下载并且它们完成时没有错误。我一直在寻找 scalatra 和 Jetty 的问题,但没有看到任何与我所看到的问题类似的问题。但是看起来有人在需要 long
时使用了 int
对于那些通过搜索结果偶然发现这个问题的人...
这是在 Jetty 问题跟踪器上处理的
https://github.com/eclipse/jetty.project/issues/630
答案是这是一个 scalatra 错误,它错误地假设 .transferTo()
可以保证发送交给它的所有字节。
scalatra 实现需要将其对 .transferTo()
的使用放在一个循环中,以验证是否已发送整个大小。
回答为什么是2GB?,那是因为transferTo()
使用java的ByteBuffer
,它本身有2GB的限制。
这已在 scalatra 2.5.0+ 中修复
http://scalatra.org/2016/11/21/2016-11-21-scalatra-2-5-released.html
我们将 scalatra 与 Jetty 9 一起使用。我们有一个服务于静态文件的端点。但我注意到任何大于 2GB 的东西似乎都会被截断。我可以看到文件被分块发送。 curl 和 wget 可以正确地开始下载并且它们完成时没有错误。我一直在寻找 scalatra 和 Jetty 的问题,但没有看到任何与我所看到的问题类似的问题。但是看起来有人在需要 long
时使用了 int对于那些通过搜索结果偶然发现这个问题的人...
这是在 Jetty 问题跟踪器上处理的 https://github.com/eclipse/jetty.project/issues/630
答案是这是一个 scalatra 错误,它错误地假设 .transferTo()
可以保证发送交给它的所有字节。
scalatra 实现需要将其对 .transferTo()
的使用放在一个循环中,以验证是否已发送整个大小。
回答为什么是2GB?,那是因为transferTo()
使用java的ByteBuffer
,它本身有2GB的限制。
这已在 scalatra 2.5.0+ 中修复 http://scalatra.org/2016/11/21/2016-11-21-scalatra-2-5-released.html