-1

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

4

2 回答 2

5

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

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

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

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

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

于 2013-09-30T08:22:37.087 回答
1

由于浏览器对 HTTP 请求时间的限制,无法将非常大的数据上传到 Web 服务器。所以你必须把你的数据分成更小的块。如果你想让这个过程对用户透明,你必须使用一些第三方技术,比​​如微软SilverLight。我以前有过这样的经历。

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

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

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

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

于 2013-09-30T05:42:57.723 回答