scala - 如何使用Akka HTTP通过输出流生成内容

标签 scala akka akka-stream akka-http

我是Akka Streams和Akka HTTP的新手。

我想生成一个简单的HTTP服务器,该服务器可以从文件夹的内容生成一个zip文件并将其发送给客户端。

org.zeroturnaround.zip.ZipUtil使创建zip文件的任务非常容易,但是它需要一个outputStream

这是我的解决方案(用Scala语言编写):

            val os = new ByteArrayOutputStream()
            ZipUtil.pack(myFolder, os)
            HttpResponse(entity = HttpEntity(
                MediaTypes.`application/zip`,
                os.toByteArray))

此解决方案有效,但是将所有内容保留在内存中,因此无法扩展。

我认为解决此问题的关键是使用此方法:
val source = StreamConverters.asOutputStream()

但不知道如何使用。 :-(

有什么帮助吗?

最佳答案

试试这个

val byteSource: Source[ByteString, Unit] = StreamConverters.asOutputStream()
  .mapMaterializedValue(os => ZipUtil.pack(myFolder, os))
HttpResponse(entity = HttpEntity(
            MediaTypes.`application/zip`,
            byteSource))

一旦实现了源,就只能访问OutputStream,
这可能不会立即发生。从理论上讲,源也可以实现多次,因此您应该能够处理此问题。

关于scala - 如何使用Akka HTTP通过输出流生成内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41126059/

相关文章:

scala - sbt- assembly:重复数据删除发现错误

scala - 如何使用 Akka HTTP 进行身份验证

java - 了解 Akka 容错

akka-stream - 应用级背压 VS TCP 原生流控

scala - 使用 Akka Http 转换 Slick Streaming 数据并发送分块响应

string - 连接两个 RDD[String] -Spark Scala

scala - Apache Spark : How to save the dataframe results (Dataframe with joins), 所以对数据帧的操作不会改变结果?

scala - 如何将 scala.xml.NodeSeq 转换为 Elem?

java - 重用现有 Actor ?

scala - Akka 流。一次控制 Akka Streams 中正在处理的项目数量