【问题标题】:Play Framework 2.6 Alpakka S3 File UploadPlay Framework 2.6 Alpakka S3 文件上传
【发布时间】:2018-02-18 16:55:41
【问题描述】:

我使用 Play Framework 2.6 (Scala) 和 Alpakka AWS S3 连接器将文件异步上传到 S3 存储桶。我的代码如下所示:

def richUpload(extension: String, checkFunction: (String, Option[String]) => Boolean, cannedAcl: CannedAcl, bucket: String) = userAction(parse.multipartFormData(handleFilePartAsFile)).async { implicit request =>
  val s3Filename = request.user.get.id + "/" + java.util.UUID.randomUUID.toString + "." + extension
  val fileOption = request.body.file("file").map {
    case FilePart(key, filename, contentType, file) =>
      Logger.info(s"key = ${key}, filename = ${filename}, contentType = ${contentType}, file = $file")
      if(checkFunction(filename, contentType)) {
        s3Service.uploadSink(s3Filename, cannedAcl, bucket).runWith(FileIO.fromPath(file.toPath))
      } else {
        throw new Exception("Upload failed")
      }
  }

  fileOption match {
    case Some(opt) => opt.map(o => Ok(s3Filename))
    case _ => Future.successful(BadRequest("ERROR"))
  }
}

它可以工作,但它会在上传到 S3 之前返回文件名。但我想在它上传到 S3 后返回值。有什么解决办法吗?

另外,是否可以将文件上传直接流式传输到 S3,以正确显示进度并且不使用临时磁盘文件?

【问题讨论】:

    标签: scala amazon-s3 playframework akka-stream alpakka


    【解决方案1】:

    你需要翻转你的source和sink来获得你感兴趣的materialized value。 你有:

    1. 从您的本地文件读取的源,并在完成读取文件后具体化为 Future[IOResult]
    2. 写入 S3 并在完成写入 S3 后具体化到 Future[MultipartUploadResult] 的接收器。

    您对后者感兴趣,但在您的代码中您使用的是前者。这是因为runWith 函数始终保持阶段的物化值作为参数传递。

    下面示例 sn-p 中的类型应该澄清这一点:

      val fileSource: Source[ByteString, Future[IOResult]]              = ???
      val s3Sink    : Sink  [ByteString, Future[MultipartUploadResult]] = ???
    
      val m1: Future[IOResult]              = s3Sink.runWith(fileSource)
      val m2: Future[MultipartUploadResult] = fileSource.runWith(s3Sink)
    

    获得Future[MultipartUploadResult]后,你可以用同样的方法map,访问location字段来获取文件的URI,例如:

      val location: URI = fileSource.runWith(s3Sink).map(_.location)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-25
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      相关资源
      最近更新 更多