Angular 8 使用 auth 获取 txt 文件 header

Angular 8 get txt file with auth header

我正在尝试实现下载 link 供用户下载 .txt 文件中的记录。

首先是一个简单的 <a> 标签

<a href="http://localhost:8080/service/api/downloadFile?fileType=daily&trsDate=20190918">download</a>

我可以从服务器下载 .txt 格式的文件。但是我发现它并没有带Authheader。所以我尝试使用http get方法来获取它。

service.js

  getCdrFile(url) {
    return this.http.get<any>(`${this.env.service}/service/api/downloadFile?` + url);
  }

component.js

downloadFile(url) {
    this.service.getCdrFile(url).subscribe(
      data => {
        console.log(data);
      },
      error => {
        console.log(error);
      }
    );
  }

我可以用 auth head 成功调用 API,然后我点击下载按钮后没有任何反应,但在 Chrome 开发人员的 "response" 选项卡中显示了 txt 数据工具。另外,我的 http 请求中 console.log(data); 什么也没有得到。

有什么文件可以下载吗?谢谢!

(这是我的回复详情)

# GENERAL
Request URL: http://localhost:8080/service/api/downloadFile?fileType=daily&trsDate=20190918
Request Method: GET
Status Code: 200 
Remote Address: 127.0.0.1:8080
Referrer Policy: no-referrer-when-downgrade

# RESPONSE HEADER
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: keep-alive
Content-Disposition: attachment; filename=20190918.txt
Content-Type: application/json
Date: Wed, 02 Oct 2019 03:51:01 GMT
Expires: 0
Pragma: no-cache
Server: nginx/1.15.2
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

您有两种方式从服务器下载文件。

1:-) 从 HTTP 调用获得响应以创建 base64 并创建虚拟锚标记并下载。

2:-) 将后端响应修改为下载响应。

您可以创建一个 Blob 响应并使用它创建一个 Blob url 并即时下载。

服务:

  • 修改您的服务以接收 blob 响应
getImage() {
  return this.httpClient.get(
    your_image_link, 
    {
      responseType: 'blob', // <-- add this
      headers: {your_headers}
    }
  );
}

组件

  • 点击页面上的 link 调用您的服务以获取文件的响应 blob
  • 创建 blob url URL.createObjectUrl 方法
  • 创建一个虚拟锚元素分配 blob url 和要下载的文件的名称
  • 在锚元素上触发点击事件
  • 使用 URL.revokeObjectUrl 方法
  • 从浏览器中删除 blob url
downloadImage() {
  this.service.getImage().subscribe(img => {
    const url = URL.createObjectURL(img);
    const a = document.createElement('a');
    a.download = "filename.txt";
    a.href = url;
    a.click();
    URL.revokeObjectURL(url);
  });
}

Stackblitz:https://stackblitz.com/edit/angular-kp3saz