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