Как сконфигуровать ссылку для скачивания файла в Vaadin Flow

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
                );
            }
        });
    }
You can leave a response, or trackback from your own site.

Leave a Reply