【问题标题】:How to detect when Vaadin FileDownloader succeeds or fails如何检测 Vaadin FileDownloader 何时成功或失败
【发布时间】:2014-11-27 00:57:47
【问题描述】:

我有 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 没有任何侦听器来发现文件下载何时失败、成功或开始。

这是我的 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;
    }
} ;

同样,这触发得太快了(并且布尔结果始终为真,即使我的 StreamSource 返回 null。)

有什么建议吗?

【问题讨论】:

    标签: vaadin


    【解决方案1】:

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

    困难似乎是 FileDownloader 的设计方式造成的。来自FileDownloader docs: “应该在用户单击时直接开始下载,例如,不通过服务器端单击侦听器的按钮,以避免在某些浏览器中触发安全警告。”

    因为没有往返网络服务器,所以下载失败、启动或成功时无处响应。

    一些模糊的(可能是坏的)解决方法的想法:

    • 让 JS 向 Web 发布某种异步通知 服务器,让它知道发生了什么。 (使用 JMS 还是 Ajax?)
    • 如果后端有某种活动进程涉及传输文件,它 会知道转移发生的时间。

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

    【讨论】:

      猜你喜欢
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2010-09-14
      • 2011-11-05
      相关资源
      最近更新 更多