使用scalatra服务器发送大文件在2^31-1字节后结束

使用scalatra服务器发送大文件在2^31-1字节后结束,scala,jetty,jetty-9,scalatra,Scala,Jetty,Jetty 9,Scalatra,我们在9号码头使用scalatra。我们有一个为静态文件服务的端点。但我注意到任何大于2GB的数据都会被截断。我可以看到文件被分块发送。Curl和wget可以正确地开始下载,并在没有错误的情况下完成。我一直在寻找scalatra和Jetty的问题,但没有看到类似的问题。但看起来好像有人在需要一个长的时使用了int,因为你们中的一些人通过搜索结果偶然发现了这个问题 这是在码头问题追踪器处处理的 答案是这是一个scalatra bug,它错误地假设.transferTo()保证发送所有传递给它的字

我们在9号码头使用scalatra。我们有一个为静态文件服务的端点。但我注意到任何大于2GB的数据都会被截断。我可以看到文件被分块发送。Curl和wget可以正确地开始下载,并在没有错误的情况下完成。我一直在寻找scalatra和Jetty的问题,但没有看到类似的问题。但看起来好像有人在需要一个长的

时使用了int,因为你们中的一些人通过搜索结果偶然发现了这个问题

这是在码头问题追踪器处处理的

答案是这是一个scalatra bug,它错误地假设
.transferTo()
保证发送所有传递给它的字节

scalatra实现需要在一个循环中使用
.transferTo()
,以验证是否发送了整个大小


要回答2GB?的原因,那是因为
transferTo()
使用java的
ByteBuffer
,它本身有2GB的限制。

这在scalatra 2.5.0中是固定的+

有些文件系统无法处理2GB以上的文件。你也是这样吗?详细描述出现问题的客户。您是否在客户机上运行Java 64位?我们使用的是ext4,因此我相信我们可以处理2GB以上的文件。我们正在为服务器运行java 64位。服务器不是问题所在,正如您所说,curl和wget处理得很好。关注client.wget和curl complete,没有错误,但文件仍然被截断,这让我觉得服务器有问题。您是否使用jetty内置的静态文件服务?还是什么习俗?(如果是定制的,您可以发布您正在使用的技术吗?)是的,这最终成为scalatra的一个问题。我们有一个修复方案,正在审查中。您可以跟踪错误的进度: