【问题标题】:Akka HTTP multiple file upload to S3Akka HTTP 多文件上传到 S3
【发布时间】:2018-08-20 02:45:54
【问题描述】:

我正在开发一个 API,以使用 Akka HTTP 将多个文件上传到 S3。我目前正在使用fileUploadAll 指令,它将所有文件缓冲到磁盘。这限制了可以处理的文件大小。有替代方法吗?我还能如何处理多部分/表单数据请求?

【问题讨论】:

    标签: scala amazon-s3 akka akka-stream akka-http


    【解决方案1】:

    这是一个简单的示例,它采用文件路径列表,将列表转换为单个 Source[ByteString, _],然后运行 ​​SourceAlpakka S3 connector Sink,将数据上传到 S3:

    val paths = List(Paths.get("/path/to/file1"), Paths.get("/path/to/file2"))
    val source: Source[ByteString, _] = Source(paths).flatMapConcat(FileIO.fromPath(_))
    
    // read the Alpakka documentation about setting up a S3 client and sink
    val s3Sink: Sink[ByteString, Future[MultipartUploadResult]] = ???
    
    val fut: Future[MultipartUploadResult] = source.runWith(s3Sink)
    

    您可以在 Akka HTTP 路由中使用 futfuture directives 之一。


    如前所述,上述方法创建了一个Source。如果您需要为每个文件提供不同的存储桶和密钥,那么您可以为每个文件启动单独的流:

    val source1: Source[ByteString, _] = FileIO.fromPath(Paths.get("/path/to/file1"))
    val source2: Source[ByteString, _] = FileIO.fromPath(Paths.get("/path/to/file2")
    
    val s3Sink1: Sink[ByteString, Future[MultipartUploadResult]] = ???
    val s3Sink2: Sink[ByteString, Future[MultipartUploadResult]] = ???
    
    val fut1: Future[MultipartUploadResult] = source1.runWith(s3Sink1)
    val fut2: Future[MultipartUploadResult] = source2.runWith(s3Sink2)
    
    val fut: Future[List[MultipartUploadResult]] = Future.sequence(List(fut1, fut2))
    

    【讨论】:

      猜你喜欢
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2018-10-09
      相关资源
      最近更新 更多