因此,我所拥有的是一个带有三列的DataView
,其中一列是一个复选框列,它使用户可以检查他们想要下载哪些文件。
为了简单起见(我认为);我已经决定将文件压缩为一个zip文件,并在生成后将其提供。
这是我到目前为止的内容:
代码::
Button downloadLogButton = new Button("downloadlogbutton") {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit() {
// Some utility class I made that zips files
LogUtility util = new LogUtility();
util.zipLogFiles("sample", logs);
}
};
Form logsForm = new Form("logsform") {
};
logsForm.add(downloadLogButton);
CheckGroup<File> checkGroup = new CheckGroup<File>("logscheckgroup", new ArrayList<File>());
WebMarkupContainer logsViewContainer = new WebMarkupContainer("datatable");
DataView<File> logsView = new DataView<File>("logrows", new ListDataProvider<File>(logs)) {
private static final long serialVersionUID = 1L;
public void populateItem(final Item<File> item) {
final File file = (File) item.getModelObject();
item.add(new Check<File>("logdownloadcheck", item.getModel()));
item.add(new Label("logname", file.getName()));
SimpleDateFormat sdf = new SimpleDateFormat( "E, dd MMM yyyy hh:mm a");
item.add(new Label("logdatemodified", sdf.format(file .lastModified())));
}
};
logsViewContainer.add(logsView);
checkGroup.add(logsViewContainer);
logsForm.add(checkGroup);
add(logsForm);
生成供下载的zip文件后,该如何处理?我有什么选择?我希望避免将它们重定向到确认页面或
Your download is ready
页面。更新
基于XaviLópez的答案,我在
Button
的onSubmit
函数中添加了以下代码。org.apache.wicket.util.file.File log = new org.apache.wicket.util.file.File("/home/keeboi/Downloads/sample.zip");
IResourceStream resourceStream = new FileResourceStream(log);
IRequestHandler target = new ResourceStreamRequestHandler(resourceStream);
getRequestCycle().scheduleRequestHandlerAfterCurrent(target);
而且我正在
HTTP Error 404: Not Found
。 最佳答案
您可以像DownloadLink
一样进行操作,并从压缩文件中创建一个FileResourceStream
。然后,只需更改当前请求周期的目标即可:
Button downloadLogButton = new Button("downloadlogbutton") {
private static final long serialVersionUID = 1L;
@Override
public void onSubmit() {
// Some utility class I made that zips files
LogUtility util = new LogUtility();
util.zipLogFiles("sample", logs);
IResourceStream resourceStream = new FileResourceStream(
new org.apache.wicket.util.file.File(someFile)); // Use whatever file you need here
IRequestTarget t = new ResourceStreamRequestTarget(stream){
@Override
public String getFileName() {
return "filename.zip";
}
}
getRequestCycle().setRequestTarget(t);
}
};
如果要在下载后删除文件,可以覆盖
IRequestTarget#respond(RequestCycle)
,如下所示:@Override
public void respond(RequestCycle requestCycle) {
super.respond(requestCycle);
// Delete the file
((FileResourceStream)getResourceStream()).getFile().delete();
}
以下相关问题也可能有用: How to use Wicket's DownloadLink with a file generated on the fly?。
关于java - Wicket:在onSubmit之后下载文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14274897/