Playframework 2.0 如何在play framework中上载大型文件?
在我的应用程序中,我试图将文件上载到目标文件夹,浏览器不允许我上载大小大于4 GB的文件,而我的文件大小为15 GB。我在这里感到震惊,不知道如何上载。任何帮助都是非常值得的。您可以分两个阶段解决此问题:Playframework 2.0 如何在play framework中上载大型文件?,playframework-2.0,Playframework 2.0,在我的应用程序中,我试图将文件上载到目标文件夹,浏览器不允许我上载大小大于4 GB的文件,而我的文件大小为15 GB。我在这里感到震惊,不知道如何上载。任何帮助都是非常值得的。您可以分两个阶段解决此问题: 您需要将巨大的文件拆分为较小的块,然后将它们发送到服务器。要实现这一点,您可以使用一些javascript库,例如resubable.js 在play2控制器中,您需要使用IterateeAPI组合这些块,然后您可以对文件执行任何您想要的操作 编辑: 让我们使用resubable.js作为客户
javascript
库,例如resubable.js
Iteratee
API组合这些块,然后您可以对文件执行任何您想要的操作李>
编辑:
让我们使用resubable.js
作为客户端的示例,我不会深入讨论细节,您可以找到文档和示例
我们的视图将是最低限度的(仅用于选择一个或多个文件的链接):
@()
@主(“文件上传”){
}
我们的javasctipt:
$(函数(){
var r=新的可恢复性({
目标:'/test/upload'
});
r、 assignBrowse(document.getElementById('browseButton');
r、 on('fileSuccess',函数(文件){
调试(文件);
});
r、 on('fileProgress',函数(文件){
调试(文件);
});
//更多事件,请查看API文档
});
我们的main.scala.html:
@(标题:字符串)(内容:Html)
@头衔
@*我们包括Resubable.js库*@
@*用于文件上传的javascript*@
@内容
以及我们的服务器端,即现场控制器:
首先,我们需要创建一个函数来处理文件部分,在我们的示例中,该函数使用Chank并生成结果数组[Byte]
//hadle文件部分作为数组[字节]
def handleFilePartAsByteArray:PartHandler[FilePart[Array[Byte]]=
手部{
案例文件信息(零件名、文件名、内容类型)=>
//只需将数据写入a ByteArrayOutputStream
Iteratee.fold[Array[Byte],ByteArrayOutputStream](
new ByteArrayOutputStream(){(操作系统,数据)=>
操作系统写入(数据)
操作系统
}.mapDone{os=>
操作系统关闭()
os.ToByte阵列
}
然后我们可以定义一个自定义主体解析器:
//将文件部分作为数组[字节]处理的自定义正文解析器
def multipartFormDataAsBytes:BodyParser[MultipartFormData[Array[Byte]]=
multipartFormData(handleFilePartAsByteArray)
最终,我们的控制器可能看起来像:
def handleFileUpload=Action(multipartFormDataAsBytes){request=>
//从数据部件检索文件名
val fileName=request.body.asFormUrlEncoded.get(“resumableFilename”).get.headOption
//从文件部分检索字节数组并将其写入文件
request.body.foreach文件{
案例文件部分(键、文件名、内容、字节)=>
导入scalax.io_
val output:output=Resource.fromFile(fileName.getOrElse(“默认”))
输出.写入(字节)
}
好的(“”)
}
控制器的导入列表:
import play.api.mvc_
导入play.api.mvc.BodyParsers.parse.Multipart_
导入play.api.libs.iteratee.iteratee
导入java.io.ByteArrayOutputStream
导入play.api.mvc.BodyParsers.parse_
导入play.api.mvc.BodyParsers.parse.Multipart.FileInfo
导入play.api.mvc.MultipartFormData.FilePart
非常感谢您发布答案,事实上我对javascript和play还不太熟悉,所以您能给我一些如何实现它的想法吗?我在play 2.4.4上,看起来有些API改变了很多。您有没有可能将答案更新到更新的版本?特别是,我正在尝试:handleFilePart