首页 > 解决方案 > 下载文件并提供服务(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 的方法是什么?

标签: springliferayportletspring-webfluxliferay-7

解决方案


对于 Liferay,文档指出,您可以使用 ....getPortletOutputStream() 来检索 OutputStream。在设置 contentlengh (这样浏览器知道期望多少)之后,你可以使用这个:Convert writes to OutputStream into a Flux<DataBuffer> used by ServerResponse

将数据写入 OutputStream


推荐阅读