spring - 下载文件并提供服务(Spring WebClient -> Liferay Porlet.serveResource)
问题描述
我想实现一个 Liferay Portlet,它从单独的服务器下载~1GB 文件,并将其提供给单击链接的网站访问者。
文件必须以内存有效的方式进行流式传输(因此不会将所有内容加载到内存中) ,并且用户应该在单击后立即 看到下载进度(因此不会将所有内容存储到本地磁盘上)。
我必须使用WebClient因为它似乎是在 Liferay 7 中发出 Web 请求的标准(RestTemplate 将被弃用)。
我开始写这样的东西,灵感来自javadoc的一个例子:
Mono<DataBuffer> bodyMono = client.get()
.uri("https://theotherserver.com/file94875.pdf")
.retrieve()
.bodyToMono(DataBuffer.class);
...我会将其输入到 portlet 的MVCResourceCommand.serveResource()
viaPortletResponseUtil.sendFile
中,它需要一个java.io.InputStream
.
不幸的是,WebClient 给了我一个Mono<DataBuffer>
(或Flux<DataBuffer>
),另一个答案声称重建 InputStream 违背了使用 WebClient 首先的目的。
实现这一点的最有效和最熟悉 WebClient 的方法是什么?
解决方案
对于 Liferay,文档指出,您可以使用 ....getPortletOutputStream() 来检索 OutputStream。在设置 contentlengh (这样浏览器知道期望多少)之后,你可以使用这个:Convert writes to OutputStream into a Flux<DataBuffer> used by ServerResponse
将数据写入 OutputStream
推荐阅读
- json - 如何使用jq在`@name`为`dbUrl`的json数组中获取`@value`的值?
- node.js - 处理 Socket.io 中的服务器故障
- azure - 在 Angular 中使用 CORS
- websocket - Mqtt 连接为 aws IOT 预签名 URL 提供 403
- python - Pandas - 检查值是否在列中,如果没有则重新询问输入
- vba - Excel VBA在复制后将复选框链接到正确的单元格
- excel - 如何对每个类别求和
- json - 是否有适用于 mac 的应用程序从表创建 JSON 并添加数据类型?
- opengl - Qt3D 渲染 32 位颜色而不是 24 位
- c# - 仅当另一个任务成功完成时才运行一个任务