Playframework 2.0 如何在play framework中上载大型文件?

Playframework 2.0 如何在play framework中上载大型文件?,playframework-2.0,Playframework 2.0,在我的应用程序中,我试图将文件上载到目标文件夹,浏览器不允许我上载大小大于4 GB的文件,而我的文件大小为15 GB。我在这里感到震惊,不知道如何上载。任何帮助都是非常值得的。您可以分两个阶段解决此问题: 您需要将巨大的文件拆分为较小的块,然后将它们发送到服务器。要实现这一点,您可以使用一些javascript库,例如resubable.js 在play2控制器中,您需要使用IterateeAPI组合这些块,然后您可以对文件执行任何您想要的操作 编辑: 让我们使用resubable.js作为客户

在我的应用程序中,我试图将文件上载到目标文件夹,浏览器不允许我上载大小大于4 GB的文件,而我的文件大小为15 GB。我在这里感到震惊,不知道如何上载。任何帮助都是非常值得的。

您可以分两个阶段解决此问题:

  • 您需要将巨大的文件拆分为较小的块,然后将它们发送到服务器。要实现这一点,您可以使用一些
    javascript
    库,例如
    resubable.js
  • 在play2控制器中,您需要使用
    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