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

时间:2014-11-27 00:57:47

标签: vaadin

我有Vaadin 7代码,可以为用户提供下载文件的选项:

    Button btnDownloadResults = new Button("Download Results", FontAwesome.CLOUD_DOWNLOAD);
    resource = new StreamResource(new MyStreamResource(), suggestedSaveAsFilename);
    new FileDownloader(resource).extend(btnDownloadResults);

我想在下载成功时触发代码,或者即使下载设法启动也是如此。用于此目的包括关闭窗口,启动进度微调器或增加下载次数。

与Vaadin上传组件不同,FileDownloader没有任何侦听器可以查找文件下载失败,成功或启动的时间。

以下是我的StreamResouce子类的简化版本:

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。)

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

经过更多的研究后,我相信答案是没有简单的方法可以从FileDownloader获取这些信息。

难度似乎是FileDownloader设计方式的结果。来自FileDownloader docs: “当用户点击例如Button而不通过服务器端点击监听器时,应直接启动下载,以避免在某些浏览器中触发安全警告。”

由于没有往返Web服务器的往返,因此在下载失败,启动或成功时无法响应。

解决方法的一些模糊(可能不好)的想法:

  • 让JS向网上发布某种异步通知 服务器,让它知道发生了什么。 (使用JMS还是Ajax?)
  • 如果后端有一些与传输文件有关的活动进程,那么 会知道转会何时发生。

但简短的回答似乎是Vaadin没有内置的方法来做到这一点。