【发布时间】:2019-06-22 13:49:30
【问题描述】:
我有 .NET webApi(.NET 4.5 框架)的 Angular 6 网络应用程序。
我正在做的是收集一些用户输入,向 webapi 发送请求。 Webapi 使用来自 db 的一些数据生成一个 excel 文件(xlsx 或 xlsm)。 现在我需要在用户机器上下载这个文件。 我已经在服务器上验证过,生成的文件是正确的,并在服务器上的临时目录中创建。 但它在用户计算机上下载为损坏的文件,Excel 无法打开它。
知道如何解决这个问题。
WebApi 代码
[System.Web.Http.HttpPut]
public ActionResult Put(Parameters inputs)
{
var path = GenerateFile(inputs);
string extension = new FileInfo(path).Extension;
switch (extension)
{
case ".xls":
return new FilePathResult(path, "application/msexcel");
case ".xlsx":
return new FilePathResult(path, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
case ".xlsm":
return new FilePathResult(path, "application/vnd.ms-excel.sheet.macroEnabled.12");
}
}
角度代码:
GenerateReprot() {
this.http.put(this.webApiURL, this.Input, 'arraybuffer')
.subscribe(
result => {
this.downLoadFile(result, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
alert('file downloaded successfully. ');
},
error => {
alert('error with downloading file.');
}
);
}
downLoadFile(data: any, type: string) {
var blob = new Blob([data], { type: type });
var url = window.URL.createObjectURL(blob);
var pwa = window.open(url);
if (!pwa || pwa.closed || typeof pwa.closed == 'undefined') {
alert('Please disable your Pop-up blocker and try again.');
}
}
【问题讨论】:
-
据我在文档中看到的
put方法将object作为第三个参数,它包含属性responseType实际上应该在您的 arraybuffer案例 - 也许有问题? -
我已经将第三个参数指定为arraybuffer this.http.put(this.webApiURL, this.Input, 'arraybuffer')
-
但是您指定的方式错误。也许这会对你有所帮助 - angular.io/guide/http#requesting-non-json-data 但在你的情况下还有身体。
-
@Abhash786 确认正在使用的平台版本。 Web API 2+ 或核心?您标记显示 asp.net-web-api 并显示
System.Web.Http命名空间,但该框架没有使用ActionResult。很可能您返回了错误的模型类型,并且它被序列化为 JSON,这就是文件阅读器认为它们已损坏的原因。 -
@Abhash786 下载的数据在客户端是什么样子的?
标签: angular asp.net-web-api angular6