下载后XLSX文件损坏

9
我正在尝试从Angular前端下载在Java后端生成的xlsx文件,我收到了带有Content-Disposition头的附件文件,并且可以使用以下js代码下载该文件,但是当我尝试打开它时,它总是出现损坏的情况。
var data = response; //from server
var blob = new Blob([data], { type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml;charset=UTF-8"});
var link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'filname.xlsx';
link.click();

如果我在控制台记录服务器响应,我发现以下内容: enter image description here 编辑:
当我尝试打开下载的文件时,如下图所示 enter image description here enter image description here 有人能帮我解决这个问题吗?

你向我们展示了console.log的结果,但没有显示调用...所以很难说。但是看着日志,似乎内容正确,为什么你说它是损坏的? - Salketer
@Salketer,我更新了问题。请看看是否有帮助。如果您需要,我可以发布API调用。 - iLaYa ツ
好的,请尝试解压该文件(将其视为 .zip 文件)。如果可以正常解压,说明文件并没有损坏,但在生成文件时出现了问题。这可能是因为缺少 XML 部分或某些参数设置不正确导致的。 - Salketer
1
此外,您可以尝试使用已知为良好的文件来测试您的下载代码... - Salketer
你现在有解决方案了@iLaYaツ - Navi
1个回答

20

我在使用 AngularJS 1.6.1 时遇到了同样的问题。当我从浏览器或window.open("url")调用HTTP GET服务时,xlsx文件能够完美下载:304628字节。然而,AngularJS提供的response.data只有289414字节,而Blob包装器则有550963字节,这是作为损坏文件下载的原因。如果我将xlsx返回为zip格式,也会出现同样的行为。

我通过设置XMLHttpRequest.responseType属性解决了这个问题:

$http.get(url, {responseType:'arraybuffer'});

2
你真的救了我!虽然我在React中使用Axios。非常感谢你的提示! - Ahmed Abdelhak
1
我正在使用Django+DRF和Vue+Axios。这终于成功了。谢谢! - cjohnson318

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接