Buduję aplikację Play Framework w Scali, w której chciałbym przesłać tablicę bajtów do S3. Używam biblioteki Play-S3, aby to zrobić. W „Multipart upload plików” sekcji Dokumentacja jest co istotne tutaj:Używanie Iteratees i enumeratorów w Play Scala do przesyłania danych do 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)
staram się robić to samo w mojej aplikacji, ale z Iteratee
s oraz Enumerator
s.
Strumienie i asynchroniczność domiar trochę skomplikowane, ale tutaj jest to, co mam tak daleko (Uwaga uploadTicket
jest zdefiniowane wcześniej w kodzie):
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
}
}
Wszystko kompiluje i działa bez incydentu. W rzeczywistości drukowane jest "Success"
, ale żaden plik nigdy nie pojawia się na S3.
Zawsze jest wiele problemów z moim kodem. Co jeszcze nowego? Ale z pewnością jest to prawda, że kawałki nie we wszystkich przypadkach wynoszą 5 MB, więc jest to problem. Mimo to spróbuję twoich pomysłów i zobaczę, co mogę zrobić. – Vidya