gpt4 book ai didi

javascript - 从 ajax 中的服务器响应获取 excel 文件(.xlsx)

转载 作者:数据小太阳 更新时间:2023-10-29 05:53:51 25 4
gpt4 key购买 nike

我在获取 excel 文件并在收到对该文件的响应(成功的 ajax 方法)后在浏览器中打开下载窗口时遇到问题。我有合适的 Content-Type 和 Content-Disposition header ,我尝试在 js 中使用 Blob 但我无法实现我想要的 - 简单的文件下载。
我完成了我的 ajax 的几个版本,其中一个在下面。我开发了 ajax,它返回我无法正确打开的 excel 文件,因为它已损坏(尽管有 .xlsx 扩展名)。

也许问题出在 Blob 构造函数中使用了不合适的数据类型?

我尝试使用“xhr.response”而不是来自成功方法参数的“数据”,但它也不起作用。我在 Chrome 的开发人员工具中检查了响应 header ,它们设置正确。
重要的是 - 在服务器端创建的所有 excel 工作簿都是正确的,因为它在以前的版本中工作,当数据在 URL 中发送时,而不是在 ajax post 中。

下面Java/Spring服务器端的 Controller 方法:

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);
}

最佳答案

看起来 JQuery 在处理来自响应的二进制数据时遇到了一些问题。我只使用了 XMLHttpRequest 并将所有数据添加到 URL。

var request = new XMLHttpRequest();
request.open('POST', url, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.responseType = 'blob';

request.onload = function(e) {
if (this.status === 200) {
var blob = this.response;
if(window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, fileName);
}
else{
var downloadLink = window.document.createElement('a');
var contentTypeHeader = request.getResponseHeader("Content-Type");
downloadLink.href = window.URL.createObjectURL(new Blob([blob], { type: contentTypeHeader }));
downloadLink.download = fileName;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
}
};
request.send();

关于javascript - 从 ajax 中的服务器响应获取 excel 文件(.xlsx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47134698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com