バイト配列を S3 にストリーミングしたい Play Framework アプリケーションを Scala で構築しています。これを行うためにPlay-S3ライブラリを使用しています。ドキュメントセクションの「マルチパートファイルのアップロード」は、ここで関連するものです。
// Retrieve an upload ticket
val result:Future[BucketFileUploadTicket] =
bucket initiateMultipartUpload BucketFile(fileName, mimeType)
// Upload the parts and save the tickets
val result:Future[BucketFilePartUploadTicket] =
bucket uploadPart (uploadTicket, BucketFilePart(partNumber, content))
// Complete the upload using both the upload ticket and the part upload tickets
val result:Future[Unit] =
bucket completeMultipartUpload (uploadTicket, partUploadTickets)
私は自分のアプリケーションで同じことをしようとしていますが、Iteratee
s とEnumerator
s を使用しています。
ストリームと非同期性により、少し複雑になりますが、これまでのところ、次のようになります (注uploadTicket
はコードの前半で定義されています)。
val partNumberStream = Stream.iterate(1)(_ + 1).iterator
val partUploadTicketsIteratee = Iteratee.fold[Array[Byte], Future[Vector[BucketFilePartUploadTicket]]](Future.successful(Vector.empty[BucketFilePartUploadTicket])) { (partUploadTickets, bytes) =>
bucket.uploadPart(uploadTicket, BucketFilePart(partNumberStream.next(), bytes)).flatMap(partUploadTicket => partUploadTickets.map( _ :+ partUploadTicket))
}
(body |>>> partUploadTicketsIteratee).andThen {
case result =>
result.map(_.map(partUploadTickets => bucket.completeMultipartUpload(uploadTicket, partUploadTickets))) match {
case Success(x) => x.map(d => println("Success"))
case Failure(t) => throw t
}
}
すべてが問題なくコンパイルおよび実行されます。実際、"Success"
印刷されますが、S3 にファイルが表示されることはありません。