gpt4 book ai didi

playframework-2.0 - 如何在 Play Framework 中上传一个巨大的文件?

转载 作者:行者123 更新时间:2023-12-03 18:23:14 27 4
gpt4 key购买 nike

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

最佳答案

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

  • 您需要将大文件拆分成更小的块,然后将它们发送到服务器。为了实现这一点,您可以使用一些 javascript库,例如 Resumable.js
  • 在您的 play2 Controller 中,您需要使用 Iteratee 组装这些块。 API,然后你可以对你的文件做任何你想做的事情。

  • 编辑:

    让我们使用 resumable.js作为客户端的示例,我不会深入研究细节,您可以找到文档和示例 here

    我们的观点将是极简主义的(只有选择一个或多个文件的链接):

    @()
    @main("File upload"){
    <a href="#" id="browseButton">Select files</a>
    }

    我们的 javasctipt :

    $(function(){
    var r = new Resumable({
    target:'/test/upload'
    });

    r.assignBrowse(document.getElementById('browseButton'));

    r.on('fileSuccess', function(file){
    console.debug(file);
    });
    r.on('fileProgress', function(file){
    console.debug(file);
    });
    // more events, look API docs
    });

    我们的 main.scala.html :

    @(title: String)(content: Html)

    <!DOCTYPE html>

    <html>
    <head>
    <title>@title</title>
    <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
    <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/style.css")">
    <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
    <script src="@routes.Assets.at("javascripts/jquery-1.9.0.min.js")" type="text/javascript"></script>
    @*We include resumable.js library*@
    <script src="@routes.Assets.at("javascripts/resumable.js")" type="text/javascript"></script>
    @*Our javascript for file upload*@
    <script src="@routes.Assets.at("javascripts/upload.js")" type="text/javascript"></script>
    </head>
    <body>
    @content
    </body>
    </html>

    而我们的服务器端,在 Play Controller 中:

    首先,我们需要创建一个函数,该函数将通过消耗我们的 chank 并产生结果来处理我们的文件部分 - 在我们的示例中为 Array[Byte]。

     // hadle file part as Array[Byte]
    def handleFilePartAsByteArray: PartHandler[FilePart[Array[Byte]]] =
    handleFilePart {
    case FileInfo(partName, filename, contentType) =>
    // simply write the data to the a ByteArrayOutputStream
    Iteratee.fold[Array[Byte], ByteArrayOutputStream](
    new ByteArrayOutputStream()) { (os, data) =>
    os.write(data)
    os
    }.mapDone { os =>
    os.close()
    os.toByteArray
    }

    然后我们可以定义一个自定义的正文解析器:

    // custom body parser to handle file part as Array[Byte]
    def multipartFormDataAsBytes:BodyParser[MultipartFormData[Array[Byte]]] =
    multipartFormData(handleFilePartAsByteArray)

    最后我们的 Controller 可能看起来像:

    def handleFileUpload = Action(multipartFormDataAsBytes){ request =>
    // retrieve file name from data part
    val fileName = request.body.asFormUrlEncoded.get("resumableFilename").get.headOption
    // retrieve arrays of byte from file part and write them to file
    request.body.files foreach{
    case FilePart(key,filename,content,bytes)=>
    import scalax.io._
    val output:Output = Resource.fromFile(fileName.getOrElse("default"))
    output.write(bytes)
    }
    Ok("")
    }

    Controller 的进口 list :

    import play.api.mvc._
    import play.api.mvc.BodyParsers.parse.Multipart._
    import play.api.libs.iteratee.Iteratee
    import java.io.ByteArrayOutputStream
    import play.api.mvc.BodyParsers.parse._
    import play.api.mvc.BodyParsers.parse.Multipart.FileInfo
    import play.api.mvc.MultipartFormData.FilePart

    关于playframework-2.0 - 如何在 Play Framework 中上传一个巨大的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19076771/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com