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

标签 playframework-2.0

在我的应用程序中,我试图将文件上传到目标文件夹,浏览器不允许我上传大于 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/

    相关文章:

    jobs - Play 2.0 的工作支持在哪里?

    playframework - 如何使用 Play Framework 2.2.x 在 build.sbt 中导入模板

    java - 配置 Play !在多个数据库环境中使用特定数据库的 2 个模型

    java - 如何在连接 JPA/Ebean 上定义多个条件

    playframework - Play Framework 2.0.x AskTimeoutException

    java - 在某些情况下,Ebean 中急于获取 blob

    java - 玩!框架 : using session for authentication

    mongodb - 吗啡的索引注释不起作用

    java - 使用 play 2.0 在电子邮件正文中发送 URL

    java - 当值保存在 Play Controller 中时,如何读取服务层中的 session 值