使用Akka将文件从服务器流式传输到客户端

时间:2016-12-14 19:22:36

标签: scala akka akka-stream akka-http

基本上我想允许用户从服务器下载csv文件。假设服务器上已存在CSV文件。通过GET / export公开API端点。如何将文件从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())
    }
  }
}

1 个答案:

答案 0 :(得分:5)

Akka-Stream API允许您直接从Source[ByteString, _]创建实体,因此您可以按照

的方式执行某些操作。
pathPrefix("export") {
  pathEndOrSingleSlash {
    get {
      complete(HttpEntity(ContentTypes.`text/csv(UTF-8)`, FileIO.fromPath(Paths.get("file.csv")))
    }
  }
}

请注意,这样您的服务器代码在通过网络发送之前不需要在内存中提取整个CSV文件。文件内容将在启用背压的流中发送。有关here的更多信息。