我正在为实验项目研究akka-http(akka-http-experimental_2.11 - 0.4)。我之前没有参与喷涂工作。
我想将一个mp4视频(大小可能会有所不同)流式传输到浏览器。但我不知道如何为HttpResponse创建HttpEntity(HttpEntity.Chunked?)。我尝试过这样的脏东西,这不是一种正确的方法,但这只适用于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)))
当我在另一个标签页或浏览器中打开相同的网址时,服务器无法处理该请求。由于这是一个实验性项目,因此没有足够的文档来处理大型文件流。
我需要知道如何为HttpEntity.Chunked创建Producer。如果任何人可以用简单的术语解释,这将有助于理解API。
谢谢。
(P.S:有人请在Stack Overflow中创建Akka-Http标签)
答案 0 :(得分:4)
我知道这个问题很老了,但是如果你还需要一个答案:我写了一个小玩具文件服务器,通过http使用内存映射IO和分块编码发送大文件。
https://gist.github.com/rklaehn/3f26c3f80e5870831f52#file-file-server-example
基本上有一种方法可以从文件生成Iterator [ByteString]。然后从该迭代器创建一个源,通过map从每个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))