Scala'da bir dizi bayt akışını gerçekleştirmek istediğim Scala'da bir Play Framework uygulaması yapıyorum. Bunu yapmak için Play-S3 kitaplığını kullanıyorum. dokümantasyon bölümünün "Çok parçalı dosya yükleme" Burada alakalı budur: Benim uygulamada ancak Iteratee
s ve Enumerator
s ile aynı şeyi yapmaya çalışıyorumS3'e Veri Akışı için Oynatma Scala'daki Yineleme ve Numaratörleri Kullanma
// 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)
.
dere ve asynchronicity işler biraz karmaşık hale, ama burada (Not uploadTicket
kodunda daha önce tanımlanmıştır) bugüne kadar ne var:
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
}
}
Her şey derler ve olaysız çalışır. Aslında, "Success"
yazdırılıyor, ancak S3'te hiçbir dosya görünmüyor.
Kodumda her zaman birden çok sorun var. Başka yeni ne var? Ancak, tüm durumlarda parçaların 5 MB olmadığı doğrudur, yani bu bir sorundur. Yine de, fikirlerinizi deneyeceğim ve neler yapabileceğimi göreceğim. – Vidya