6

我正在为一个实验项目开发 akka-http(akka-http-experimental_2.11 - 0.4)。而且我之前没有在Spray上工作过。

我想将 mp4 视频(大小可能不同)流式传输到浏览器。但我不知道如何为 HttpResponse(HttpEntity.Chunked ?)创建 HttpEntity。我尝试过像这样肮脏的东西,这不是正确的方法,但这在 Firefox 中仅适用于单个请求。

def output =  Source.fromFile("C:\\Users\\karthik\\Downloads\\big_buck_bunny.mp4")(scala.io.Codec.ISO8859)

lazy val video = HttpResponse(entity = HttpEntity.Chunked(MediaTypes.`video/mp4`, Flow(output.map(_.toByte).map(a => ChunkStreamPart(ByteString(a)))).toProducer(materializer)))

当我在另一个选项卡或浏览器中打开相同的 url 时,服务器无法处理该请求。由于这是一个实验项目,因此没有足够的文档用于大文件流式传输。

我得到了示例源代码形式https://github.com/akka/akka/blob/release-2.3-dev/akka-http-core/src/test/scala/akka/http/TestServer.scala

我需要知道如何为 HttpEntity.Chunked 创建 Producer。如果有人可以简单地解释一下,那将有助于理解 API。

谢谢你。

(PS:有人请在 Stack Overflow 中创建 Akka-Http 标签)

4

1 回答 1

4

我知道这个问题已经很老了,但如果您仍然需要答案:我编写了一个小玩具文件服务器,它使用内存映射 IO 和分块编码通过 http 发送大文件。

https://gist.github.com/rklaehn/3f26c3f80e5870831f52#file-file-server-example

基本上有一种从文件生成 Iterator[ByteString] 的方法。然后,您从该迭代器创建一个源,通过映射从每个 ByteString 创建一个 ChunkStreamPart,并在途中发送它。

val mappedByteBuffer = map(path)
val iterator = new ByteBufferIterator(mappedByteBuffer, 4096)
val chunks = Source(() => iterator).map(ChunkStreamPart.apply)
HttpResponse(entity = HttpEntity.Chunked(MediaTypes.`application/octet-stream`, chunks))
于 2015-01-31T23:08:33.410 回答