可以使用
下载文件AjaxLink<Void> downloadButton = new AjaxLink<Void>("downloadButton") {
@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
}
?还是只能通过onSubmit()
操作来实现?因为我有一个通过单击按钮下载文件的工作代码,但是该方法使用了onSubmit
。现在,我尝试使用这种按钮执行相同的操作,它以相同的方式准备文件,甚至在我的本地文件中创建一个临时文件,但是当涉及到浏览器中的弹出窗口时,它什么都不做。可能是什么问题呢?
编辑:
这是有效的代码,但是,如果我在AjaxLink中使用相同的代码,它将无法如前所述正常工作:
@Override
protected void onSubmit() {
super.onSubmit();
File file = null;
try {
file = File.createTempFile("temp-file-name", ".csv");
String data = getData();
if (data == null) {
FileUtils.writeByteArrayToFile(file, ("").getBytes());
} else {
FileUtils.writeByteArrayToFile(file, data.getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
if (file == null) {
throw new IllegalStateException(getClass().getName() +
" failed to retrieve a File object from model");
}
final File preparedFile = file;
IResourceStream resourceStream = new FileResourceStream(
new org.apache.wicket.util.file.File(file));
getRequestCycle().scheduleRequestHandlerAfterCurrent(
new ResourceStreamRequestHandler(resourceStream) {
@Override
public void respond(IRequestCycle requestCycle) {
super.respond(requestCycle);
Files.remove(preparedFile);
}
}.setFileName("Report.csv")
.setContentDisposition(ContentDisposition.ATTACHMENT));
}
}
}
答案 0 :(得分:2)
您不能仅在Ajax响应中流式传输文件。
您需要使用Wicket的AjaxDownloadBehavior。它提供了克服此限制的逻辑。
演示代码:https://github.com/apache/wicket/blob/0ba3ce015ae9f258246b92ac599a00481a26c37f/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java 演示进行中:http://examples8x.wicket.apache.org/ajax/download