我在页面上有一个HTML按钮,用于触发从服务器下载zip文件。服务器代码可以在浏览器中正常运行。当前的JS代码在同步模式下实现了一个AJAX GET请求,这个工作正常。成功回调调用下载函数来处理响应并完成操作,所有这一切都正常。
现在这是我的问题:在此设置中,我无法添加进度微调器(或显示请等待消息),而服务器返回zip文件,因为在ajax请求之前不会执行任何操作直到我通过在函数中注释这些行使其异步。只有这样我才能看到我的请等待消息,但现在请求被触发,只是立即返回执行错误回调。 TextStatus是“错误”,errorThrown是“”。最奇怪的是请求实际被触发并且服务器处理它但是当它尝试写入响应时,它会抛出一个“破坏管道”异常,嵌套的“IllegalStateException:Response already committed”。
我有另一个使用类似模式的功能,但不是下载文件而是上传文件。这个在异步模式下运行正常,同时显示我的请等待消息。他们与同一个servlet交谈。有谁知道我可能做错了什么?先谢谢。
这是我调用JS函数的HTML按钮:
<button id="exportButton" title="Export Project" onclick="exportProject()">Export project</button>
以下是执行AJAX请求的JS函数:
function exportProject() {
$.blockUI();
// $.ajaxSetup({'async':false});
$.ajax({
url: 'url/that/works/ok/anywhere/else',
type: 'GET',
contentType: 'text/plain',
headers: { 'operation': 'export', 'Accept': 'text/plain' },
success : function(data, textStatus, jqXHR) {
downloadProject(jqXHR.getResponseHeader('FileName'), data, 'application/zip');
},
error : function(jqXHR, textStatus, errorThrown) {
alert("Sorry, there was an error. " + errorThrown);
},
complete: function(){
$.unblockUI();
}
});
// $.ajaxSetup({'async':true});
return false;
}
最后,这是处理GET请求的Java servlet的片段:
//Read bytes from file contents
byte[] bytes = Files.readAllBytes(zipFile.toPath());
//Encoding bytes to a Base64 string for safe transport
String encodedString = Base64.encodeBase64String(bytes);
//Setting response headers for correct browser handling
response.setContentType("text/plain");
response.setContentLength(encodedString.length());
response.setHeader("Content-Disposition", "attachment; filename='"+zipFile.getName()+"';");
response.setHeader("FileName", zipFile.getName());
response.setStatus(HttpServletResponse.SC_OK);
//Writing ZIP file to response
response.getOutputStream().print(encodedString);
来自服务器的异常片段(WildFly 10):
java.io.IOException: Broken pipe
...
13:11:33,800 ERROR [io.undertow.request] (default task-3) UT005023: Exception handling request to /url/that/works/ok/anywhere/else: java.lang.IllegalStateException: UT010019: Response already commited
答案 0 :(得分:0)
按钮提交。您在函数中返回false,但事件处理程序不是。
sudo svn --username user --password password co http://xxxx.xx/svn/projectname/
其他选项是添加<button id="exportButton" title="Export Project" onclick="return exportProject()">Export project</button>
^^^^^^^