可以使用下载文件
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));
}
}
}
最佳答案
您不能只在 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
关于java - 单击按钮后不开始下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58623503/