我正在尝试在java的播放框架中上传一个大小为15 Gb的文件,但由于浏览器不允许它而收到错误?任何帮助都是非常值得的
答案 0 :(得分:5)
HTTP中没有任何内容阻止您上传15GB文件或15TB文件。从理论上讲,如果使用分块传输编码并且底层文件系统可以处理它,则Play没有最大文件大小。对于未中型请求,理论最大值为2 ^ 63字节(8192千兆字节),因为底层网络服务器 - Netty - 使用long
来处理Content-Length标头。
但是,某些Web浏览器使用有符号/无符号32位整数来管理内容长度,这使它们最多为2GB或4GB。 Google Chrome和Opera都没有此限制,因此如果您的用户想要上传15GB文件,则应使用Google Chrome或Opera。
播放可以处理15GB的上传,但我强烈建议您在scalaVersion := "2.10.3"
中设置Build.scala
,早期版本的Scala和iteratees存在内存问题。
默认情况下,Play会将multipart/form-data
正文部分保存到临时文件中。在Scala中,您可以通过提供自定义PartHandler将其更改为直接流式传输到数据库或类似内容。有关更多文档,请参见此处:
http://www.playframework.com/documentation/2.2.x/ScalaFileUpload
答案 1 :(得分:1)
由于浏览器对HTTP请求时间的限制,无法将非常大的数据上传到Web服务器。因此,您必须将数据拆分为较小的块。如果您希望此过程对用户透明,则必须使用某些第三方技术,如Microsoft SilverLight
。我之前有过这样的经历。
您可以实现隐藏的SilverLight
组件(没有任何GUI),其主要职责是读取文件,将其拆分为较小的部分并透明地上传到服务器。您可以通过JavaScript调用其功能。这样,您还可以过滤文件类型(通过扩展名),并让用户同时选择多个文件。该组件将文件拆分为所需的大小,将它们单独上传到服务器并确认主机页面(通过调用JavaScript
回调)关于进程结束。然后,您可以通过主页提交主表单(或发送原始AJAX请求)并访问服务器端上传的文件。
您可以临时保存服务器上的文件部分,并将票证返回到SilverLight
组件,并将其传递到主机页面,以便在服务器上查找上传的文件。
另一种解决方案是在HTML5中使用FileAPI。并非所有浏览器都支持它,但是当您尝试仅在本地计算机上执行此操作时,您可以安装所需版本的浏览器。此API中有一个切片功能,可让您读取内存中大文件的一部分。在您的情况下,您可以使用此功能读取文件并单独发送每个部分。看看这个链接: