我有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。)
有什么建议吗?
答案 0 :(得分:1)
经过更多的研究后,我相信答案是没有简单的方法可以从FileDownloader获取这些信息。
难度似乎是FileDownloader设计方式的结果。来自FileDownloader docs: “当用户点击例如Button而不通过服务器端点击监听器时,应直接启动下载,以避免在某些浏览器中触发安全警告。”
由于没有往返Web服务器的往返,因此在下载失败,启动或成功时无法响应。
解决方法的一些模糊(可能不好)的想法:
但简短的回答似乎是Vaadin没有内置的方法来做到这一点。