angular - 将文件从 WebAPI 下载到 Angular 6 应用程序
问题描述
我有带有 .NET webApi(.NET 4.5 框架)的 Angular 6 的 Web 应用程序。
我正在做的是收集一些用户输入,向 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.');
}
}
解决方案
您的标签显示asp.net-web-api并且您显示System.Web.Http
命名空间,但该框架没有ActionResult
使用。所以看起来你正在混合 MVC 和 Web API 之间的框架
您很可能返回了错误的模型类型,并且它被序列化为 JSON,这就是文件阅读器认为它们已损坏的原因。
以下假设它是在一个ApiController
[HttpPut]
public IHttpActionResult Put(Parameters inputs) {
var path = GenerateFile(inputs);
var file = new FileInfo(path);
string contentType = null;
switch (file.Extension) {
case ".xls":
contentType = "application/msexcel";
case ".xlsx":
contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
case ".xlsm":
contentType = "application/vnd.ms-excel.sheet.macroEnabled.12";
}
var stream = file.OpenRead();
var content = new StreamContent(stream);
content.Headers.ContentLength = stream.Length;
content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {
FileName = file.Name
};
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = content;
return ResponseMessage(response);
}
推荐阅读
- android - 从 Firestore 中的字段获取数据
- postgresql - 如何将 CSV 从 HDFS 导出到 Postgresql
- python - 具有多个和代码编辑参数的 shutil.copy() 文件
- shell - 在脚本外壳中编写字符串
- javascript - 错误:正文必须是字符串。使用 Type-graphql 和 apollo-server-express 时收到:{ resolvers: [[function HelloResolver]], validate: false }
- swift - 在 Xcode 中仅从包含多个框架的文件夹中导入一个框架
- python-3.x - 如何通过python中的套接字发送整数
- angular - 动态行详细信息取决于内容高度,ngx-datatable 可能吗?
- c# - 管理缓存异步数据的最佳实践/良好模式是什么?
- javascript - 使用 console.log 时无法读取未定义的属性“clientX”