return Playframework 2.5 (scala) 中 S3 的内容

return content from S3 in Playframework 2.5 (scala)

在 Playframework 2.4.X 我从 S3 中恢复了内容:

  val s3Client = new AmazonS3Client()
  val s3doc = s3Client.getObject(new GetObjectRequest(bucketName, key))
  val stream = s3doc.getObjectContent

  Ok.feed(Enumerator.fromStream(stream)).as(contentType)

但是现在 2.5 .feed 是@deprecated("Use sendEntity with a Streamed entity instead"

我想应该是这样的:

Ok.sendEntity(HttpEntity.Streamed(stream, None, None))

但我需要将流转换为 Source[ByteString, _]

我该怎么做?

Assets controller has an "example" 怎么做。基本上,你需要做这样的事情:

import akka.stream.scaladsl.Source
import play.api.libs.streams.Streams

val stream = s3doc.getObjectContent
val data = Enumerator.fromStream(stream)

val source = Source.fromPublisher(Streams.enumeratorToPublisher(data)).map(ByteString.apply)
Ok.sendEntity(HttpEntity.Streamed(source, None, Some(contentType)))

编辑:

我没有时间测试它,但在更好地了解之后Akka Stream source code,也许这也是一个可能的(更简单的)解决方案:

val stream = s3doc.getObjectContent
val source: Source[ByteString, _] = StreamConverters.fromInputStream(() => stream)
Ok.sendEntity(HttpEntity.Streamed(source, None, Some("")))