【发布时间】:2019-07-13 19:16:57
【问题描述】:
我敢肯定,多年来,这个问题和类似的变体已经在这里被问过很多次了。我已经经历了几乎所有事情,但仍然无法正确执行。
我有一个 .NET Core API 端点,它返回一个表示 zip 文件的字节数组:
[HttpGet]
[Route("download/{fileId}/")]
public byte[] Download(long fileId)
{
...
}
我使用 AngularJS 的 $http 服务和 arraybuffer 作为 responseType 来发起请求:
// AngularJS service (fileApiService)
this.downloadFile = function (fileId) {
var url = apiUrl + 'download/' + fileId;
return $http.get(url, { responseType: 'arraybuffer' });
};
我得到一个有效的响应,它的处理方式如下。我使用FileSaver.js 来访问saveAs 方法和Blob 构造函数:
// AngularJS controller
fileApiService.downloadFile(fileId)
.then(function (response) {
var data = response.data;
var blob = new Blob([data], { type: 'application/octet-stream' });
FileSaver.saveAs(blob, 'file.zip');
})
.catch(function () {
...
});
不幸的是,无论我对上述代码进行什么调整,这都会导致存档文件损坏。 Window 10 zip 实用程序抱怨即使文件不为空,也无法打开存档。我尝试了以下方法:
- 在
$http.get()请求中将responseType设置为blob并直接将其传递给FileSaver.saveAs()方法 - 将
application/zip和其他 MIME 类型传递给Blob构造函数 - 将
{ autoBOM: true }传递给FileSaver.saveAs()方法
我怀疑这是一个编码问题,因为另一个 ASP.NET Web 窗体应用程序可以从同一个 API 端点下载有效的 zip 文件。
任何指针将不胜感激。提前致谢!
【问题讨论】:
标签: angularjs blob angular-http arraybuffer filesaver.js