通过 Akka HTTP / Akka Streams 转发 (Downloading/Uploading) 大文件
Forwarding (Downloading/Uploading) Large File via Akka HTTP / Akka Streams
我有一项服务从客户端获取 HttpRequest,通过 REST 从另一台服务器获取文件,然后将该文件作为 HttpResponse 转发给客户端。
不要问我为什么客户不要文件him/herself因为那是一个很长的故事。
我编写了一个策略,将文件下载到文件系统,然后将文件发送到客户端。这是使用来自@RamonJRomeroyVigil 的其他 stackoveflow 响应的摘录。
def downloadFile(request: HttpRequest, fileName: String): Future[IOResult] = {
Http().singleRequest(request).flatMap { response =>
val source = response.entity.dataBytes
source.runWith(FileIO.toPath(filePath))
}
}
def buildResponse(fileName: String)
val bufferedSrc = scala.io.Source.fromFile(fileName)
val source = Source
.fromIterator(() => bufferedSrc.getLines())
.map(ChunkStreamPart.apply)
HttpResponse(entity = HttpEntity.Chunked(ContentTypes.`application/octet-stream`, source))
}
但是,我想在不保存文件系统和利用流功能的情况下一步完成。
我还想将客户端可以同时服务的请求数量限制为 5。
谢谢
由于您已经从第二台服务器获取文件流,您可以将其直接转发给客户端。您只需要即时构建 HttpResponse
:
def downloadFile(request: HttpRequest) : Future[HttpResponse] = {
Http().singleRequest(request).map {
case okResponse @ HttpResponse(StatusCodes.OK, _, _, _) =>
HttpResponse(
entity = HttpEntity.Chunked(ContentTypes.`application/octet-stream`,
okResponse
.entity
.dataBytes
.map(ChunkStreamPart.apply)
))
case nokResponse @ HttpResponse(_, _, _, _) =>
nokResponse
}
}
要更改客户端允许的最大并发请求数,您需要设置 akka.http.client.host-connection-pool.max-connections
和
akka.http.client.host-connection-pool.max-open-requests
。可以找到更多详细信息 here。
我有一项服务从客户端获取 HttpRequest,通过 REST 从另一台服务器获取文件,然后将该文件作为 HttpResponse 转发给客户端。
不要问我为什么客户不要文件him/herself因为那是一个很长的故事。
我编写了一个策略,将文件下载到文件系统,然后将文件发送到客户端。这是使用来自@RamonJRomeroyVigil 的其他 stackoveflow 响应的摘录。
def downloadFile(request: HttpRequest, fileName: String): Future[IOResult] = {
Http().singleRequest(request).flatMap { response =>
val source = response.entity.dataBytes
source.runWith(FileIO.toPath(filePath))
}
}
def buildResponse(fileName: String)
val bufferedSrc = scala.io.Source.fromFile(fileName)
val source = Source
.fromIterator(() => bufferedSrc.getLines())
.map(ChunkStreamPart.apply)
HttpResponse(entity = HttpEntity.Chunked(ContentTypes.`application/octet-stream`, source))
}
但是,我想在不保存文件系统和利用流功能的情况下一步完成。
我还想将客户端可以同时服务的请求数量限制为 5。
谢谢
由于您已经从第二台服务器获取文件流,您可以将其直接转发给客户端。您只需要即时构建 HttpResponse
:
def downloadFile(request: HttpRequest) : Future[HttpResponse] = {
Http().singleRequest(request).map {
case okResponse @ HttpResponse(StatusCodes.OK, _, _, _) =>
HttpResponse(
entity = HttpEntity.Chunked(ContentTypes.`application/octet-stream`,
okResponse
.entity
.dataBytes
.map(ChunkStreamPart.apply)
))
case nokResponse @ HttpResponse(_, _, _, _) =>
nokResponse
}
}
要更改客户端允许的最大并发请求数,您需要设置 akka.http.client.host-connection-pool.max-connections
和
akka.http.client.host-connection-pool.max-open-requests
。可以找到更多详细信息 here。