Vaadin Flow предоставляет удобный механизм для скачивания файлов. Этот API работает с классом com.vaadin.flow.server.StreamResource, который пришел на смену классу com.vaadin.server.StreamResource. И если вы раньше работали с vaadin, то не ищите в vaadin flow класс StreamResource.StreamSource.
Этот механизм позволяет инкапсулировать отдачу файла с бэкенда, который находится в защищенной сети — Vaadin flow назначит динамическую ссылку, которая будет работать только у одного конкретного пользователя. К тому же, можно передать HTTP заголовки — например, заголовок с данными для авторизации. Можно назвать это пробросом запроса на скачивание файла.
В данном случае открывается соединение по ссылке finalUrlString, делается GET запрос с заголовком авторизации, из ответа берется тело ответа в виде connection.getInputStream(), тело ответа копируется в outputStream и выдается клиенту.
import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; ... public static StreamResource createResource(String finalUrlString, String fileName, MessageSource messageSource, Locale locale, String basicAuth) { return new StreamResource(fileName, (StreamResourceWriter) (outputStream, vaadinSession) -> { if (StringUtils.isBlank(finalUrlString)) { throw new IllegalArgumentException("Url is empty!"); } try { URL url = new URL(finalUrlString); URLConnection connection = url.openConnection(); if (StringUtils.isNotBlank(basicAuth)) { connection.setRequestProperty("Authorization", basicAuth); } //https://stackoverflow.com/questions/12732422/adding-header-for-httpurlconnection connection.setUseCaches(false); IOUtils.copy(connection.getInputStream(), outputStream); } catch (Exception exc) { Notification.show( messageSource.getMessage("downloadAuditError", null, locale), NOTIFICATION_DURATION_MILLISEC, Notification.Position.BOTTOM_END ); } }); } |