Загрузите файл и обслужите его (Spring WebClient -> Liferay Porlet.serveResource) - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу реализовать портлет Liferay, который загружает файл ~ 1 ГБ с отдельного сервера и передает его посетителю веб-сайта, который щелкнул ссылку.

Файл должен быть потоковым с эффективным использованием памяти способом (поэтому загрузка всего в память не требуется) , и пользователь должен увидеть процесс загрузки вскоре после нажатия (поэтому нетхранение всего на локальном диске) .

Я должен использовать WebClient , потому что он кажется стандартным для выполнения веб-запросов в Liferay 7 (RestTemplate будет устаревшим ).

Я начал писать что-то вроде этого, вдохновленное примером из javadoc :

Mono<DataBuffer> bodyMono = client.get()
 .uri("https://theotherserver.com/file94875.pdf")
 .retrieve()
 .bodyToMono(DataBuffer.class);

..., который я вставил бы в портлетMVCResourceCommand.serveResource() через PortletResponseUtil.sendFile, который ожидает java.io.InputStream.

К сожалению, WebClient дает мне Mono<DataBuffer> (или Flux<DataBuffer>), а другой ответ утверждает, что реконструирует InputStreamпобеждает цель использования WebClient впервое место .

Какой самый эффективный и удобный способ реализовать это?

1 Ответ

0 голосов
/ 12 февраля 2019

В случае Liferay в документации говорится, что вы можете использовать .... getPortletOutputStream () для получения OutputStream.После установки contentlengh (чтобы браузер знал, чего ожидать), вы можете использовать это: Преобразование записей в OutputStream в поток , используемый ServerResponse

Для записи ваших данных в OutputStream

...