如何检测Vaadin FileDownloader何时成功或失败

如何检测Vaadin FileDownloader何时成功或失败,vaadin,Vaadin,我有Vaadin 7代码,用户可以选择下载文件: Button btnDownloadResults = new Button("Download Results", FontAwesome.CLOUD_DOWNLOAD); resource = new StreamResource(new MyStreamResource(), suggestedSaveAsFilename); new FileDownloader(resource).extend(btnDownlo

我有Vaadin 7代码,用户可以选择下载文件:

    Button btnDownloadResults = new Button("Download Results", FontAwesome.CLOUD_DOWNLOAD);
    resource = new StreamResource(new MyStreamResource(), suggestedSaveAsFilename);
    new FileDownloader(resource).extend(btnDownloadResults);
我希望在下载成功时触发代码,或者即使下载成功启动。这包括关闭窗口、启动进度微调器或增加下载计数

与Vaadin Upload组件不同,FileDownloader没有任何侦听器来查找文件下载失败、成功或启动的时间

下面是我的StreamResource子类的简化版本:

public class MyStreamResource implements StreamSource {
@Override
public InputStream getStream() {
    String filename = /* code to determine the filename */;

    try {
        final File results = new File(FilenameUtils.normalize(filename));
        return new FileInputStream(results);
    } catch (FileNotFoundException fnfe) {
        String errorMsg = "Cannot download results. Try again later, or contact your sysadmin.";
        Utilities.showError(errorMsg);

        return null;
    } catch (Exception e) {
        Utilities.logAndShowException(e);
        return null;
    }
}
}
请注意,getStream方法在提示用户将文件保存到何处(用户可以选择取消)之前返回,因此我无法从该方法内部触发任何内容

我得到的一个建议是将FileDownloader子类化如下:

FileDownloader fileDownloader = new FileDownloader(fileInputStream) {
    private static final long serialVersionUID = -4584979099145066535L;
    @Override
    public boolean handleConnectorRequest(VaadinRequest request, VaadinResponse response, String path) throws IOException {
        boolean result = super.handleConnectorRequest(request, response, path);
        if (result) {
            /* YOUR LOGIC GOES HERE */
        }
        return result;
    }
} ;
同样,这会触发得太快(而且布尔结果始终为true,即使我的StreamSource返回null)


有什么建议吗?

经过更多的研究,我相信答案是没有简单的方法可以从文件下载程序获取这些信息

这个困难似乎是FileDownloader设计方式的结果。从: “当用户单击按钮时,应直接开始下载,而无需通过服务器端的单击侦听器,以避免在某些浏览器中触发安全警告。”

因为没有往返到web服务器的路径,所以当下载失败、启动或成功时,没有地方响应

一些模糊的(可能是不好的)解决方案:

  • 让JS向web发布某种异步通知 服务器,让它知道发生了什么。(使用JMS或Ajax?)
  • 如果后端有某种活动进程涉及到文件传输,那么 会知道什么时候发生转移
但简单的答案似乎是,瓦丁没有内在的方式来做到这一点