从API角度接收文件

问题描述 投票:0回答:1

我的api正在生成一个pdf文件并返回它。我在邮递员中收到的标头是...

Content-Type →application/pdf
Content-Length →2099
Content-Disposition →attachment; filename=Ticket_20200409210413358621_Home_3.pdf
Cache-Control →public, max-age=43200
Expires →Fri, 10 Apr 2020 09:04:13 GMT
Access-Control-Allow-Origin →*

而且我可以从邮递员那里毫无问题地保存文件内容。

但是,当我尝试将其弄成角度时,出现问题。

我将标题设置为...

setRequestHeaderPDF() {
  return new HttpHeaders({
    'Authorization': 'Bearer ' + localStorage.getItem('id_token'),
    'Content-Type': 'application/pdf',
    'Accept': 'application/pdf'
  })
}

然后我正在尝试两种不同的方法。

首先是responseType: 'blob'。这不会返回斑点。正如您在上面看到的那样,问题是文件名位于响应头中。使用blob响应,我无法获得标题。

第二,我没有设置responseType并希望将其从响应文本/正文中删除,但这会引发以下错误

消息:“ JSON中位置0处的意外令牌%”堆:“ SyntaxError:JSON中意外的令牌%在XMLHttpRequest.l的JSON.parse()↵的位置0↵“

所以我的问题是,如何从API获取文件并可以访问标头和数据?

angular pdf httpresponse
1个回答
0
投票

更新:原来是身份验证代理必须删除标题或其他内容。当我绕过时,现在可以正常获取文件。

我发现,如果使用CORS,则必须公开某些标头。该API位于python烧瓶中,因此我在此处添加了CORS(app, expose_headers=['Content-Disposition', 'x-suggested-filename'],如此处How to change downloading name in flask?

邮递员我得到

Content-Type →application/pdf
Content-Length →2093
Content-Disposition →attachment; filename=Ticket_20200410171501039158_Home_3.pdf
Cache-Control →public, max-age=43200
Expires →Sat, 11 Apr 2020 05:15:01 GMT
x-suggested-filename →Ticket_20200410171501039158_Home_3.pdf
Access-Control-Allow-Origin →*
Access-Control-Expose-Headers →Content-Disposition, x-suggested-filename
Via →1.1 google
Alt-Svc →clear

并且在我的角度应用程序中,我切换到了使用XMLHttpRequest()。

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.setRequestHeader('Authorization', 'Bearer ' + localStorage.getItem('id_token'));
xhr.setRequestHeader('Content-Type', 'application/pdf');
xhr.setRequestHeader('Accept', 'application/pdf');
xhr.responseType = 'blob';
xhr.onload = function (this, event) {
    var blob = this.response;
    console.log(this.getAllResponseHeaders());
    var contentDispo = this.getResponseHeader('Content-Disposition');
    var fileName = contentDispo.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/)[1];
    saveAs(blob, fileName);
}
xhr.send();

但是,它仍然仅显示以下标题

content-type: application/pdf
cache-control: public, max-age=43200
expires: Sat, 11 Apr 2020 03:24:43 GMT

即使chrome开发工具网络监视器也不显示x-uggested-filename标头。

© www.soinside.com 2019 - 2024. All rights reserved.