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("")))
在 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("")))