【发布时间】:2018-04-18 11:36:08
【问题描述】:
在获得该文件的响应(以成功的 ajax 方法)后,我在获取 excel 文件和在浏览器中打开下载窗口时遇到问题。我有合适的Content-Type and Content-Disposition headers,我尝试在 js 中使用 Blob,但我无法实现我想要的 - 简单的文件下载。
我完成了几个版本的 ajax,其中一个如下。我开发了 ajax,它返回我无法正确打开的 excel 文件,因为它已损坏(尽管扩展名为 .xlsx)。
也许问题在于 Blob 构造函数中使用了不适当的数据类型?
我尝试使用“xhr.response”而不是成功方法参数中的“数据”,但它也不起作用。我在 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);
}
My 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);
}
【问题讨论】:
标签: javascript ajax excel content-type content-disposition