首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Angular文件下载,名称来自content Content-Disposition

Angular文件下载,名称来自content Content-Disposition
EN

Stack Overflow用户
提问于 2020-05-11 23:36:28
回答 1查看 1.7K关注 0票数 0

我想使用angular下载生成的xls文件,并根据响应头Content-Disposition设置文件名。

我使用的东西是

代码语言:javascript
运行
复制
downloadFile(): Observable<any> {
  var url= "http://somehting";
  return this.http.get(url, { observe: 'response', responseType: 'blob' as 'json' });  
}

然后在我的控制器中:

代码语言:javascript
运行
复制
this.dataService.downloadFile().subscribe(
    data => {
        this.debug.msg("response:", JSON.stringify(data));
        saveAs(data.body, "test.xlsx");
    },
    err => {
        console.error(err);
        alert("Problem while downloading the file.\n" + "[" + err.status + "] " + err.statusText);
    }
);

不幸的是,响应头没有设置,正文也是空的。

代码语言:javascript
运行
复制
response: {
   "headers":{
      "normalizedNames":{

      },
      "lazyUpdate":null
   },
   "status":200,
   "statusText":"OK",
   "url":"http://localhost:4200/MyEndpoint/GetDownload",
   "ok":true,
   "type":4,
   "body":{

   }
}

如果我将procedure更改为responseType:response.headers,那么我可以获得文件的内容,但我不知道如何访问blob。我错过了什么吗?如果是这样,那是什么?

EN

回答 1

Stack Overflow用户

发布于 2020-05-12 00:10:47

基于其他堆栈溢出的posts...this适用于我

在服务器集头上

代码语言:javascript
运行
复制
Response.Headers.Add("Access-Control-Expose-Headers", "content-disposition");

angular dataService定义的下载程序。重要的是将observable设置为HttpResponse

代码语言:javascript
运行
复制
  downloadFile(): Observable<HttpResponse<Blob>> {

    var url =  "http://host/GetDownload";

    return this.http.get<Blob>(url, { observe: 'response', responseType: 'blob' as 'json' });
  }

和控制器

代码语言:javascript
运行
复制
 this.dataService.downloadFile().subscribe(
      data => {

        var fileName = "report.xlsx";
        const contentDisposition = data.headers.get('Content-Disposition');
        if (contentDisposition) {
          const fileNameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
          const matches = fileNameRegex.exec(contentDisposition);
          if (matches != null && matches[1]) {
            fileName = matches[1].replace(/['"]/g, '');
          }
        }

        saveAs(data.body, fileName);
      },
      err => {
        console.error(err);
        this.blockUI.stop();
        alert("Problem while downloading the file.\n"+
            "["+err.status+"] "+err.statusText);
      });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61733551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档