我想实现一个Liferay Portlet,它可以从单独的服务器下载〜1GB文件,并将其提供给单击链接的网站访问者。
文件必须以内存有效的方式流式传输(这样就不会将所有内容加载到内存中),并且用户应在下载后不久看到下载进度单击 (这样就不会将所有内容都存储到本地磁盘上)。
我必须使用WebClient,因为它似乎是在Liferay 7中发出Web请求的标准(RestTemplate将为deprecated)。
受javadoc的示例启发,我开始写这样的内容:
Mono<DataBuffer> bodyMono = client.get()
.uri("https://theotherserver.com/file94875.pdf")
.retrieve()
.bodyToMono(DataBuffer.class);
...我将通过MVCResourceCommand.serveResource()
将其输入到portlet的PortletResponseUtil.sendFile
中,期望java.io.InputStream
。
不幸的是,WebClient给了我Mono<DataBuffer>
(或Flux<DataBuffer>
),另一个答案是reconstructing the InputStream defeats the purpose of using WebClient in the first place。
实现此目的最有效且最了解WebClient的方法是什么?
答案 0 :(得分:0)
对于Liferay,文档指出,您可以使用.... getPortletOutputStream()检索OutputStream。 设置contentlengh(使浏览器知道期望值)之后,可以使用以下命令:Convert writes to OutputStream into a Flux<DataBuffer> usable by ServerResponse
要将数据写入OutputStream