Scala 播放框架:将文件内容流式传输到S3
我正在尝试使用Play的Scala 播放框架:将文件内容流式传输到S3,scala,amazon-s3,playframework,Scala,Amazon S3,Playframework,我正在尝试使用Play的EssentialAction以以下方式将文件内容流式传输到S3: def upload(fileName: String) = EssentialAction { request => val (iteratee, enumerator) = Concurrent.joined[Array[Byte]] blobStore.streamToStore(fileName, enumerator) //consumes the enumerator
EssentialAction
以以下方式将文件内容流式传输到S3:
def upload(fileName: String) = EssentialAction { request =>
val (iteratee, enumerator) = Concurrent.joined[Array[Byte]]
blobStore.streamToStore(fileName, enumerator) //consumes the enumerator, streams to S3 and returns Future[Unit]
iteratee.map { _ =>
Logger.debug(s"Successfully uploaded file=$fileName")
Created(Json.obj("id" -> fileName))
}
}
如果
blobStore.streamToStore
成功流式处理,则上述操作有效,但如果流式处理时出现任何错误,则请求永远不会完成,在iteratee上执行recover
也没有帮助。有人能解释一下在这种情况下如何处理错误吗?我只是需要在出现错误时使用枚举器:
blobStore.streamToStore(fileName, enumerator).recover {
case throwable =>
/* consume the enumerator for request to complete */
enumerator |>> Iteratee.consume[Array[Byte]]().map(_ => throw throwable)
}
iteratee.map { _ =>
Logger.debug(s"Successfully uploaded file=$fileName")
Created(Json.obj("id" -> fileName))
}.recover {
case NonFatal(throwable) =>
InternalServerError(Results.EmptyContent())
}