由于文件操作安全性的各种问题,我被迫通过Ajax post方法调用提交请求。服务器端URL收到此消息并给出pdf文件作为响应。 Java servlet中的服务器端代码如下。
ServletOutputStream out = response.getOutputStream();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=" + outFile);
//create the pdf file
response.flushBuffer();
在客户端,JavaScript代码正在将呼叫发送到POST,该POST通过doPost调用上述代码。通过form.submit()提交表单时,该文件可以很好地下载为pdf文件。当尝试通过Ajax调用时,它在错误部分下给了我未定义的响应。客户端代码如下。
var formData = new FormData();
//Fill formData with fields and files
console.log('Posting form from ajax');
$.ajax({
url: "/createPdf",
type: "POST",
data: formData,
contentType: false,
processData: false,
xhrFields: {
responseType: 'blob'
},
success: function (response, status, xhr) {
console.log('Processing response');
download(response, "merged.pdf", "application/pdf" );
},
error: function (xhr, status, error)
{
var err = xhr.responseText;
alert(err);
}
在上面,它没有得到成功响应。它正在发生错误和未定义的警报。我在这里做错了。如果重要的话,我的jquery版本是1.8.0.min.js。下载功能指的是http://danml.com/download.html,但我也尝试了其他代码片段,但都没有成功。
在“检查”工具下,我看到了成功请求和响应的blob数据,但是要在浏览器的“网络”下显示blob数据大约需要10-15秒。
请帮助。我整个晚上都在看,似乎无法找出不确定的答案。
答案 0 :(得分:-1)
对于ajax下载,您应该动态添加链接,触发点击,然后删除。
var formData = new FormData();
//Fill formData with fields and files
console.log('Posting form from ajax');
$.ajax({
url: "/createPdf",
type: "POST",
data: formData,
contentType: false,
processData: false,
xhrFields: {
responseType: 'blob'
},
success: function (response, status, xhr) {
var a = document.createElement('a');
var url = window.URL.createObjectURL(response);
a.href = url;
a.download = 'myfile.pdf';
a.click();
window.URL.revokeObjectURL(url);
},
error: function (xhr, status, error)
{
var err = xhr.responseText;
alert(err);
}
答案 1 :(得分:-2)
您在form.submit()中提到它可以正常工作。您使用的是POST还是GET类型? I World尝试在您的Ajax请求中更改它。我不是Java专业人士,但也许您的Servlet只响应GET请求。当我使用Ajax和Servlet时,我使用了http Servlet重写了doGet方法。