我正在尝试(使用FileSaver.saveAs)下载从服务器(nodejs \ express)获取的zip字节数组。我设法将其下载为zip,但无法打开(无效)。 关于数据的定义方式,我几乎没有遗漏任何内容-服务器和客户端中的内容类型,responseType,是否应该将其转换为blob等)-但我认为我在详细内容中克服了它们下面的代码。 问题出在最后一个功能中,即 exportAsZip 函数中-数据以正确的大小到达该位置,但是将其转换为Blob会使它膨胀,并且很可能损坏了它。 这是我的代码(服务器端-使用中间件功能的node.js-express): 此问题已按照固定代码进行更新: 路由器是快速路由器:
router.use(<some route>,(req, res, next) => {
return getData(req.query).then((dataResult) =>
{
{
res.contentType('application/zip');
return res.send([dataResult]); //Data result is byte array
}).catch((err) => {
console.error(err);
});
});
在客户端(角度): 这是组件函数:
downloadAsZip()
{
let fileName : string = <fileName>;
this.srv.getData().subscribe(result =>
{
// const blob = new Blob([result], { type: 'application/octet-stream' })
/*This is the needed fix:*/
const byteArray = new Uint8Array(result);
const blob = new Blob([byteArray]);
this.fileService.exportAsZip(blob, fileName);
},
error => console.log(error)
);
}
这是srv.getData代码:
getData() : Observable<any>
{
return this.http.get(<path>, /*{ responseType: 'blob' } - not needed*/)
}
这是fileService函数(exportAsZip):
exportAsZip(data, fileName)
{
/*The data is with a correct size, but converting it to a blob object inflate its size*/
/*this should be removed also*/
//const blobData: Blob = new Blob([data], {type: 'application/zip'});
FileSaver.saveAs(/*blobD*/data, fileName + '.zip');
}
答案 0 :(得分:0)
解决了问题-主要更改是将字节Array数据转换为Uint8Array,然后创建将使用FileSaver.saveAs保存的Blob。 另外,从获取请求标头中删除了{responseType:'blob'}。 上面的代码现已修复!