5

バイト配列を 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)

私は自分のアプリケーションで同じことをしようとしていますが、Iteratees とEnumerators を使用しています。

ストリームと非同期性により、少し複雑になりますが、これまでのところ、次のようになります (注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 にファイルが表示されることはありません。

4

1 に答える 1