当前位置: 首页 > 知识库问答 >
问题:

来自API的角度接收文件

曹骞仕
2023-03-14

我的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'
  })
}

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

首先是使用< code>responseType: 'blob'。这返回blob没有问题。正如您在上面看到的,问题是文件名在响应头中。对于blob响应,我无法获取标题。

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

消息: “位置 0 处的 JSON 中出现意外令牌 % ” 堆栈 : “语法错误:JSON 中位于位置 0↵ 的意外令牌 % 在 JSON.parse ()↵ 处

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

共有1个答案

颛孙铭
2023-03-14

更新:原来是身份验证代理肯定一直在剥离标头或其他东西。当我绕过它时,我现在可以很好地获取文件。

好吧,我发现如果使用CORS,您必须公开某些标头。API在python烧瓶中,所以我添加了CORS(应用程序,expose_headers=[“内容处置”,“x建议文件名”],因为这里回答如何更改烧瓶中的下载名称?

在《邮差》中,我得到了

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

在我的angular应用程序中,我切换到使用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();

这似乎现在起作用了。

 类似资料:
  • 我无法将组件中的变量绑定为具有角度4的模式。此代码的工作原理: 但是当我尝试添加类似的内容时: 并像这样添加: 它没有。还尝试了以下变体: 没有成功。角度4

  • 问题内容: 我需要使用套接字从C ++客户端到Java服务器接收包含浮点数的数组或类。但是InputStreamReader没正确。任何原因。任何更简单的建议将不胜感激。谢谢。 Java服务器代码 我将那些浮点数存储在名为“值”的类中。但是我得到的价值是垃圾。我在发送前检查C ++代码中的值,它们看起来不错。不知道哪里出了问题。请帮忙…!! 问题答案: 我建议你试试

  • 我如何转换这个:新缓冲区(client_id':'client_secret). toString('base64') 到角度? 我需要去访问令牌,但不起作用。 医生:https://developer.spotify.com/web-api/authorization-guide/

  • 我正在学习一门连接node.js和Angular的课程。我正在按照教程,但我得到了一个错误,我不知道该怎么办。有人能帮忙吗? 这是我得到的错误 TypeError:错误。json不是CatchSubscriber的函数。CatchSubscriber上的eval[作为选择器](message.service.ts?5cfd:25)。MapSubscriber出现错误(catchError.js?0

  • 我想要做的是将数据传递给从insid路线 在应用程序组件ts中,我有这个 那么这样的路线 在profile组件中,我需要以某种方式将标题传递给route。。 我尝试将其放在ngOnInit中,但它不起作用 因此,我想问,是否有可能以某种方式实现这一目标。 我试着跟着 它成功地改变数据,但有问题,所以它只是保持无限导航