我正在尝试在 java 的 play 框架中上传大小为 15 Gb 的文件,但由于浏览器不允许它而出现错误?任何帮助都是非常可观的
2 回答
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
由于浏览器对 HTTP 请求时间的限制,无法将非常大的数据上传到 Web 服务器。所以你必须把你的数据分成更小的块。如果你想让这个过程对用户透明,你必须使用一些第三方技术,比如微软SilverLight
。我以前有过这样的经历。
您可以实现一个隐藏SilverLight
组件(没有任何 GUI),它的主要职责是读取文件,将其拆分为更小的部分,然后透明地将它们上传到服务器。您可以通过 JavaScript 调用它的函数。这样您还可以过滤文件类型(按扩展名),还可以让用户同时选择多个文件。该组件会将文件拆分为所需的大小,将它们单独上传到服务器并JavaScript
在进程结束时确认主机页面(通过调用回调)。然后,您可以通过主机页面提交您的主表单(或发送原始 AJAX 请求)并访问服务器端上传的文件。
您可以将文件部分临时保存在服务器上,并将票证返回给将SilverLight
其传递到主机页面的组件,以便在服务器上查找上传的文件。
另一种解决方案是在 HTML5 中使用 FileAPI。并非所有浏览器都支持它,但由于您尝试仅在本地计算机上执行此操作,因此您可以安装所需版本的浏览器。此 API 中有一个切片功能,可让您读取内存中大文件的一部分。在您的情况下,您可以使用此功能读取文件并单独发送每个部分。看看这个链接: