Angular API多Excel文件打包Zip下载空包问题求助
解决后端返回ZIP压缩包下载后为空的问题
核心问题是你没给API请求设置正确的响应类型,默认情况下请求会把二进制的ZIP数据当成JSON解析,转成字符串后再构造Blob,数据已经损坏,所以解压后是空的。按下面步骤修改:
第一步:修改API请求的响应类型
不管你的apiService用的是axios还是其他请求库,必须明确指定响应类型为arraybuffer或者blob。以axios为例,getDownload方法里要补充配置:
// 示例:修改apiService中的getDownload方法 getDownload(info) { return axios.get('/你的下载接口地址', { params: info, responseType: 'arraybuffer' // 关键:指定二进制响应类型,避免数据被转成字符串 }) }
第二步:修正前端Blob构造和下载代码
原代码存在语法错误(Blob构造器多了一个括号),同时要把MIME类型改成ZIP对应的格式,文件名也换成.zip后缀:
let filename = 'download.zip' // 建议统一用async/await写法,避免then和await混用 try { const response = await this.apiService.getDownload(info) // 用原始二进制数据构造Blob,指定ZIP的MIME类型 const downloadBlob = new Blob([response.data], { type: 'application/zip' }) window['saveAs'](downloadBlob, filename) } catch (error) { console.log(error) }
为什么之前的方法无效?
默认的响应类型是json,浏览器会把后端返回的二进制ZIP数据强行解析成JSON,这个过程会把二进制流转成乱码字符串,再用这个字符串构造Blob,得到的文件已经不是有效的ZIP格式,自然解压后为空。指定responseType: 'arraybuffer'后,会直接保留原始二进制数据,构造出来的Blob才是完整可解压的ZIP包。
内容的提问来源于stack exchange,提问作者JustThatGuy93
相关产品推荐
相关产品推荐

