我正在使用wicket框架。
我要求向客户端浏览器发送几个单独的文件(zip文件不相关)。
我在我的页面中添加了一个扩展AbstractAjaxBehavior的AJAXDownload类 - 一个向客户端发送文件的解决方案,如下所示:
download = new AJAXDownload(){
@Override
protected IResourceStream getResourceStream(){
return new FileResourceStream(file){
@Override
public void close() throws IOException {
super.close();
file.delete();
}
};
}};
add(download);
在我的代码中的其他一点,我尝试使用ajax请求启动向客户端下载多个文件,同时循环遍历文件的arraylist然后每次触发AJAXDownload:
ArrayList<File> labelList = printLabels();
for(int i=0; i<labelList.size(); i++){
file = labelList.get(i);
//initiate the download
download.initiate(target);
}
但是,它只向客户端发送这些文件中的一个。我已经检查过,文件肯定是在服务器端创建的。但其中只有一个被发送给客户。
有谁能让我知道我做错了什么?
由于
答案 0 :(得分:0)
你正在做的一切都是正确的! 我不知道如何解决你的问题,但我会尝试解释发生了什么,以便其他人可以提供帮助:
Ajax响应有几个条目,如:
<evaluate>document.location=/some/path/to/a/file</evaluate>
wicket-ajax.js只是遍历评估并执行它们。如果有一个条目,那么一切正常 - 您已下载文件。但是如果还有更多,那么浏览器会在很短的时间内收到多次更改location
的请求。显然它只丢掉了其中一个。
一个明显的解决方案是使用回调/承诺 - 当下载完成然后触发下一个。问题是如何从浏览器接收这样的下载完成的通知。或者至少我不知道。
可以根据超时(即setTimeout
)推出解决方案,但这很容易出错。
我希望这些信息足以让其他人为您提供解决方案!