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

Streaming file from server to client using Akka

基本上我想允许用户从服务器下载一个 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())
    }
  }
}

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

的方式做一些事情
pathPrefix("export") {
  pathEndOrSingleSlash {
    get {
      complete(HttpEntity(ContentTypes.`text/csv(UTF-8)`, FileIO.fromPath(Paths.get("file.csv")))
    }
  }
}

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