使用akka将流文件的内容作为HttpResponse进行流处理

amrnrhlw  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(152)

我正在通过Java FileInputStream阅读大文件的一部分,并希望将其内容流回客户端(以akka HttpResponse的形式)。我想知道这是否可行,以及我将如何做到这一点?
根据我的研究,EntityStreamingSupport可以使用,但只支持json或csv数据。我将从文件中流原始数据,这将不会是json或csv的形式。

7jmck4yq

7jmck4yq1#

假设你使用akka-http和Scala,你可以使用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)

希望这对你有帮助
保禄

相关问题