1

在 Playframework 2.4.XI 中,从 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, _]

我该怎么做呢?

4

1 回答 1

2

资产控制器有一个如何做到这一点的“示例” 。基本上,您需要执行以下操作:

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("")))
于 2016-03-08T16:29:01.170 回答