在通过成功的ajax方法得到响应后,我无法获取Excel文件并在浏览器中打开下载窗口。 我有适当的Content-Type和Content-Disposition标头
,我尝试在js中使用Blob,但是我无法实现我想要的简单文件下载。
我完成了几个版本的ajax,其中之一如下所示。 我开发了可以返回Excel文件的ajax,但我无法正确打开它,因为它已损坏(尽管具有.xlsx扩展名)。
也许问题出在Blob构造函数中使用的不适当数据类型?
我尝试使用“xhr.response”而不是来自success方法参数的“data”,但这也不起作用。 我在Chrome的开发人员工具中检查了响应标头,它们被正确设置了。
重要的事情是,服务器端创建的所有Excel工作簿都是正确的,因为在以前的版本中,数据是通过URL发送的,而不是在ajax post中发送的。
以下是Java / Spring服务器端的控制器方法:
response.reset();
response.setContentType("application/vnd.ms-excel");
response.addHeader("Content-Disposition","attachment;filename=\"" + className + " " + title + ".xlsx\"");
try (ServletOutputStream output = response.getOutputStream()){
workbook.write(output);
output.flush();
} catch (Exception e) {
throw new RuntimeException(e);
}
我的 Ajax 下载文件并打开下载窗口:
$.ajax({
url: myUrl,
type: 'POST',
data: myData,
success: function(data, status, xhr) {
var contentType = 'application/vnd.ms-excel';
var filename = "";
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
}
console.log("FILENAME: " + filename);
try {
var blob = new Blob([data], { type: contentType });
var downloadUrl = URL.createObjectURL(blob);
var a = document.createElement("a");
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
} catch (exc) {
console.log("Save Blob method failed with the following exception.");
console.log(exc);
}
fileName
未被定义。你在哪里定义它? - Möoz