Код загрузки Vaadin Flow работает для Chrome, но не для Firefox. Как я могу поддерживать оба варианта?

У меня есть следующий код для загрузки файла из Vaadin Flow (12.0.7).

exportBtn.addClickListener(e -> {
toDownload = FileUtil.getLatestExport();

(toDownload != null) {
                StreamResource resource = new StreamResource(toDownload.getName(),
                        () -> FileUtil.getInputStreamForFile(toDownload));

                Element object = new Element("object");
                object.setAttribute("download", true);
                object.setAttribute("data", resource);

                Input name = new Input();
                UI.getCurrent().getElement().appendChild(name.getElement(), object);
   }
});

toDownload находит файл, который я хочу скачать. Если я нажму кнопку в Chrome, браузер загрузит мой файл, если я нажму кнопку в Firefox, ничего не произойдет. Каким образом мне нужно настроить свой код для поддержки Chrome и Firefox?

Я использовал это руководство в качестве справочного материала. .


person LOLWTFasdasd asdad    schedule 12.06.2019    source источник
comment
Вы пытались загрузить с помощью элемента Anchor, как в stackoverflow.com/questions/52150056?   -  person Steffen Harbich    schedule 13.06.2019
comment
@SteffenHarbich прав. Для этого следует использовать класс Anchor: vaadin.com/forum/thread/17081792/   -  person Jay    schedule 13.06.2019
comment
Предоставленный вами ресурс подходит для Vaadin 8. Я не уверен, что смогу использовать его и для Vaadin Flow. Кроме того, я думаю, что использование элемента привязки работает только для статического контента? Документация Vaadin 10 предлагает способ, которым я это сделал для обслуживания динамически сгенерированного контента. vaadin.com/docs/v10/flow/advanced/tutorial- dynamic-content.html Могу ли я использовать метод anchor.setHref для обслуживания динамического контента в вашем случае?   -  person LOLWTFasdasd asdad    schedule 13.06.2019
comment
Пожалуйста, прочтите ссылки еще раз, это для Vaadin Flow.   -  person Steffen Harbich    schedule 15.06.2019


Ответы (1)


Существует также обходной путь для загрузок, вызванных каким-либо действием в Vaadin Flow, например у вас есть кнопка, которая условно показывает диалоговое окно перед загрузкой файла:

 Anchor hiddenDownloadLink = new Anchor(createYourStreamResource(), "Workaround");
 hiddenDownloadLink.setId("DownloadLinkWorkaround_" + System.currentTimeMillis());
 hiddenDownloadLink.getElement().setAttribute("style", "display: none");
 // TODO: add the link somehwere in your view
 UI.getCurrent().getPage().executeJs("document.getElementById('" + hiddenDownloadLink.getId().orElseThrow() + "').click();");

Протестировано в FF, Chrome и Edge. Обходной путь имитирует щелчок по привязке, запускающий загрузку.

person Steffen Harbich    schedule 31.07.2019