代码之家  ›  专栏  ›  技术社区  ›  Teyu11

Akka HTTP多文件上传到S3

  •  1
  • Teyu11  · 技术社区  · 7 年前

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   Jeffrey Chung    7 年前

    下面是一个简单的示例,它获取文件路径列表,将列表转换为单个 Source[ByteString, _] ,并运行 Source 使用 Alpakka 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)
    

    你可以使用 fut 其中一个 future directives 在Akka HTTP路由中。


    如上所述,上述方法创建了一个 来源 。如果每个文件需要不同的存储桶和密钥,则可以为每个文件启动单独的流:

    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))