angularjs - 在 AngularJS 中从 API REST 加载文件生成文件已损坏
问题描述
我已经生成了一个关于 API REST 的 excel 报告并将其发送到前面(AngularJS)。如果我直接从浏览器点击 url,一切正常,但如果我从 Angularjs 执行,则不会,但是当我尝试打开它时说:
Excel 无法打开文件“filename.xlsx”,因为文件格式或文件扩展名无效。验证文件没有损坏,并且文件扩展名与文件格式匹配。”
这是我的代码:
$http.get(urls.SERVICE_API + "informe/"+ angular.toJson(informeDTO)).then(
function(response) {
console.log(response.data);
console.log(response.headers('Content-Type'));
console.log(response.config);
var headers = response.headers;
var filename = "IOPReport.xlsx";
var contentType = response.headers('Content-Type');
var linkElement = document.createElement('a');
try {
var blob = new Blob([response.data], { type: contentType });
var url = window.URL.createObjectURL(blob);
linkElement.setAttribute('href', url);
linkElement.setAttribute("download", filename);
var clickEvent = new MouseEvent("click", {
"view": window,
"bubbles": true,
"cancelable": false
});
linkElement.dispatchEvent(clickEvent);
} catch (ex) {
console.log(ex);
}
console.log("GenerarInformeIOP - success");
deferred.resolve(response);
}, function(errResponse) {
console.log("GenerarInformeIOP - error");
deferred.reject(errResponse);
});
return deferred.promise;
}
} ]);
知道为什么不工作吗?
解决方案
如果是 CSV,可能还需要添加 BOM:
// HTTP response data
var data = response.data;
if (type === 'csv') {//Adding BOM at start of content if it is a csv
data = '\uFEFF' + data;
}
您需要在单击之前将 linkElement 附加到正文:
var url = URL.createObjectURL(blob);
linkElement.setAttribute('href', url);
linkElement.setAttribute('download', filename);
linkElement.style.visibility = 'hidden';
document.body.appendChild(link);
linkElement.click();
document.body.removeChild(link);
推荐阅读
- typescript - 从联合中提取鉴别器值的类型
- python - 用硒打开的 Chrome 页面保持空白
- r - 如何读取多个 csv 并在每个文件名中保留数字?
- azure-media-services - azure 媒体服务直播中的 Stream Key
- vue.js - 在 vuetify 中隐藏选项卡标题
- javascript - 是否有一种惯用的 Javascript 方法可以避免为失败的 `Array.find()` 提供默认值?
- ios - 在具有多个联系人选择的反应本机应用程序中打开默认的 ios 联系人列表
- excel - 识别列表 VBA
- javascript - page.evaluate 和 page.$ 的不同行为具有后续功能
- javascript - 表单只发送一个文件/图像