【问题标题】:Streaming file from server to client using Akka使用 Akka 将文件从服务器流式传输到客户端
【发布时间】:2016-12-14 19:22:36
【问题描述】:

基本上我想允许用户从服务器下载 csv 文件。假设 CSV 文件已经存在于服务器上。 API 端点通过 GET /export 公开。如何将文件从 Akka HTTP 服务器流式传输到客户端?这就是我目前所拥有的......

服务:

def export(): Future[IOResult] = {
    FileIO.fromPath(Paths.get("file.csv"))
      .to(Sink.ignore)
      .run()
}

路线:

pathPrefix("export") {
  pathEndOrSingleSlash {
    get {
      complete(HttpEntity(ContentTypes.`text/csv`, export())
    }
  }
}

【问题讨论】:

    标签: scala akka akka-stream akka-http


    【解决方案1】:

    Akka-Stream API 允许您直接从 Source[ByteString, _] 创建实体,因此您可以按照以下方式进行操作

    pathPrefix("export") {
      pathEndOrSingleSlash {
        get {
          complete(HttpEntity(ContentTypes.`text/csv(UTF-8)`, FileIO.fromPath(Paths.get("file.csv")))
        }
      }
    }
    

    请注意,通过这种方式,您的服务器代码无需在通过网络发送之前将整个 CSV 文件提取到内存中。文件内容将在启用背压的流中发送。更多关于这个here。

    【讨论】:

    • 谢谢!对我来说,下一步是在写入行时将文件流式传输到客户端,而无需先在服务器上创建临时文件。
    • @perry 你能分享一下你接下来做了什么吗?
    • def export(): Source[ByteString, _] = Source.fromPublisher(db.stream(things.result.transactionally.withStatementParameters(fetchSize = 1000))) 其中things 是一个TableQuery
    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多