【发布时间】: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