6

私は実験プロジェクトの akka-http(akka-http-experimental_2.11 - 0.4) に取り組んでいます。私は以前にスプレーに取り組んだことがありません。

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 のプロデューサーを作成する方法を知る必要があります。簡単な言葉で説明できる人がいれば、API を理解するのに役立ちます。

ありがとうございました。

(PS: スタック オーバーフローで 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 に答える