Akka HTTP 多文件上传到 S3
Akka HTTP multiple file upload to S3
我正在开发 API 以使用 Akka HTTP 将多个文件上传到 S3。我目前正在使用 fileUploadAll
指令,它将所有文件缓冲到磁盘。这限制了可以处理的文件的大小。有替代方法吗?我还能如何处理 multipart/form-data 请求?
这是一个简单的示例,它采用文件路径列表,将列表转换为单个 Source[ByteString, _]
,然后使用 Alpakka S3 connector Sink
运行 Source
将数据上传到 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
与 Akka HTTP 路由中的 future 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))
我正在开发 API 以使用 Akka HTTP 将多个文件上传到 S3。我目前正在使用 fileUploadAll
指令,它将所有文件缓冲到磁盘。这限制了可以处理的文件的大小。有替代方法吗?我还能如何处理 multipart/form-data 请求?
这是一个简单的示例,它采用文件路径列表,将列表转换为单个 Source[ByteString, _]
,然后使用 Alpakka S3 connector Sink
运行 Source
将数据上传到 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
与 Akka HTTP 路由中的 future 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))