上传一个 15 Gb 的文件并将其下载到 PlayFramework 中,以便 java.is 可能



我正在尝试在java的play框架中上传大小为15 Gb的文件,但由于浏览器不允许而出错?任何帮助都非常可观

HTTP 中没有任何内容可以阻止您上传 15GB 文件或 15TB 文件。 理论上,如果使用分块传输编码,并且底层文件系统可以处理它,则 Play 可以处理的文件没有最大大小。 对于未分块的请求,理论上的最大值为 2 ^ 63 字节(8192 PB(,因为底层 Web 服务器 - Netty - 使用 long 来处理内容长度标头。

但是,某些 Web 浏览器使用有符号/无符号 32 位整数来管理内容长度,这使得它们的最大长度为 2GB 或 4GB。 谷歌浏览器和Opera都没有此限制,因此如果您的用户想要上传15GB的文件,他们应该使用Google Chrome或Opera。

Play可以处理15GB的上传,但我强烈建议在Build.scala中设置scalaVersion := "2.10.3",早期版本的Scala和迭代存在内存问题。

默认情况下,Play 会将multipart/form-data身体部位保存到临时文件中。 在 Scala 中,您可以通过提供自定义 PartHandler 将其更改为直接流式传输到数据库或类似内容。 有关更多文档,请参阅此处:

http://www.playframework.com/documentation/2.2.x/ScalaFileUpload

由于浏览器对 HTTP 请求时间的限制,无法将非常大的数据上传到 Web 服务器。因此,您必须将数据拆分为较小的块。如果要使此过程对用户透明,则必须使用一些第三方技术,例如Microsoft SilverLight。我以前有过这样的经历。

您可以实现一个隐藏的SilverLight组件(没有任何 GUI(,其主要职责是读取文件,将其拆分为较小的部分并透明地将它们上传到服务器。你可以通过JavaScript调用它的函数。这样,您还可以过滤文件类型(按扩展名(,还可以让用户同时选择多个文件。该组件会将文件拆分为所需的大小,将它们单独上传到服务器,并在进程结束时确认主机页面(通过调用JavaScript回调(。然后,您可以通过主机页面提交主表单(或发送原始 AJAX 请求(,并在服务器端访问上传的文件。

您可以将文件部分临时保存在服务器上,并将票证返回给SilverLight组件,该组件将其传递到主机页面,以便在服务器上查找上传的文件。

另一种解决方案是在HTML5中使用FileAPI。并非所有浏览器都支持此功能,但由于您尝试仅在本地计算机上执行此操作,因此可以安装所需版本的浏览器。此 API 中有一个切片功能,可让您读取内存中大文件的一部分。在您的情况下,您可以使用此功能读取文件并单独发送每个部分。看看这个链接:

使用文件 API 读取 JavaScript 中的文件

最新更新