我正在通过Java FileInputStream阅读大文件的一部分,并希望将其内容流回客户端(以akka HttpResponse的形式)。我想知道这是否可行,以及我将如何做到这一点?根据我的研究,EntityStreamingSupport可以使用,但只支持json或csv数据。我将从文件中流原始数据,这将不会是json或csv的形式。
7jmck4yq1#
假设你使用akka-http和Scala,你可以使用getFromFile将整个二进制文件从path流到HttpResponse,如下所示:
getFromFile
path
HttpResponse
path("download") { get { entity(as[FileHandle]) { fileHandle: FileHandle => println(s"Server received download request for: ${fileHandle.fileName}") getFromFile(new File(fileHandle.absolutePath), MediaTypes.`application/octet-stream`) } } }
取自此文件上传/下载往返akka-http示例:https://github.com/pbernet/akka_streams_tutorial/blob/f246bc061a8f5a1ed9f79cce3f4c52c3c9e1b57a/src/main/scala/akkahttp/HttpFileEcho.scala#L52对整个文件进行流处理消除了对“手动分块”的需要,因此上面的示例将以有限的堆大小运行。然而,如果需要,可以如下进行手动分块:
val fileInputStream = new FileInputStream(fileHandle.absolutePath) val chunked: Source[ByteString, Future[IOResult]] = akka.stream.scaladsl.StreamConverters .fromInputStream(() => fileInputStream, chunkSize = 10 * 1024) chunked.map(each => println(each)).runWith(Sink.ignore)
希望这对你有帮助保禄
1条答案
按热度按时间7jmck4yq1#
假设你使用akka-http和Scala,你可以使用
getFromFile
将整个二进制文件从path
流到HttpResponse
,如下所示:取自此文件上传/下载往返akka-http示例:https://github.com/pbernet/akka_streams_tutorial/blob/f246bc061a8f5a1ed9f79cce3f4c52c3c9e1b57a/src/main/scala/akkahttp/HttpFileEcho.scala#L52
对整个文件进行流处理消除了对“手动分块”的需要,因此上面的示例将以有限的堆大小运行。
然而,如果需要,可以如下进行手动分块:
希望这对你有帮助
保禄