Vaadin FileDownload需要点击两次按钮才能下载

时间:2017-09-21 04:23:18

标签: java vaadin vaadin8

我跟随Vaadin示例代码,但是当我这样做时,我需要再次单击才能启动文件下载。以下是我的代码:

final StreamResource streamResource = new StreamResource(
        () -> {
            return new ByteArrayInputStream("hello world".getBytes());
        }, document.getName() + ".txt");

FileDownloader fileDownloader = new FileDownloader(streamResource);
fileDownloader.extend(getDownloadButton());

创建按钮的代码并没有什么特别之处,但是根据评论中的要求,它是:

Button downloadButton = new Button("Download");

3 个答案:

答案 0 :(得分:0)

虽然我不喜欢这个解决方案,但它确实有效。它与下载的工作方式和浏览器的一些限制有关。我确定这是一个更好的解决方案,但现在我用Javascript模拟第一次点击。如果有人能找到正确的答案,那么请发布它,我将更改所选答案,否则这是我找到的唯一解决方案(发布在Vaadin论坛中)。

streamResource = createStreamResource();
downloadButton createDownloadButton();
downloadButton.setId("DownloadButtonID");

if(fileDownloader == null)
{
    fileDownloader = new FileDownloader(streamResource);
    fileDownloader.extend(downloadButton);
    // Javascript click so that it works without a second click
    Page.getCurrent().getJavaScript().execute(
           "document.getElementById('DownloadButtonID').click();");
} else {
    fileDownloader.setFileDownloadResource(streamResource);
}

答案 1 :(得分:0)

下载文件的第二次点击要求的解决方案是按钮的监听器。就像我的情况一样,我有按钮的点击监听器,其中 FileDownloader 扩展按钮。但它应该没有监听器,因为FileDownloader有自己的机制来处理监听器操作。

这里,第一个按钮点击由clickListener处理,只有在那个文件中,fileDownloader扩展下载按钮,它保存下载文件的所有功能,只有当click事件通过FileDownloader时才会出现此功能。所以下次点击会通过FileDownloader,因为它现在扩展了按钮。

public static Button getDownloadButton(String fileName, String fileAsString, String caption) {
    // caption
    Button dwnButton = new Button(caption, VaadinIcons.DOWNLOAD);
    dwnButton.addClickListener(listener -> {
        StreamResource resource = createResource(fileName, fileAsString);
        FileDownloader fileDownloader = new FileDownloader(resource);
        fileDownloader.extend(dwnButton);
    });
    return dwnButton;
} 

这里,fileDownloader已经扩展了按钮,它拥有所有的流资源。所以在第一次点击时只会调用下载。

public static Button getDownloadButton(String fileName, String fileAsString, String caption) {
    // caption
    Button dwnButton = new Button(caption, VaadinIcons.DOWNLOAD);
    StreamResource resource = createResource(fileName, fileAsString);
    FileDownloader fileDownloader = new FileDownloader(resource);
    fileDownloader.extend(dwnButton);
    return dwnButton;

}

答案 2 :(得分:0)

对我来说,我在虚构资源的构造函数中使用了FileDownloader:

if (fileDownloader == null) {
    fileDownloader = new FileDownloader(streamResourceDummy);
    fileDownloader.extend(button);
}

并在按钮事件侦听器中设置实际资源:

buttonClick(ClickEvent event){
if (fileDownloader != null) {
// close previous stream
((StreamResource) fileDownloader.getFileDownloadResource()).getStreamSource().getStream().close();
    fileDownloader.setFileDownloadResource(streamResource);
}

}

它工作:))。我正在使用Vaadin 8。