Vue a标签如何携带请求头?

思否 问答 👍 2 含 AI 优化版

问题

Vue a标签如何携带请求头?

在 SegmentFault 查看原问题 →

由大模型辅助整理,保留原意,优化结构与可读性。

问题概述

在 Vue 项目中,希望用 <a> 标签直接下载一个需要携带自定义请求头(如 Authorization token)才能访问的资源,但 <a> 标签本身无法设置请求头。

涉及技术

HTML <a> 标签、AJAX/fetch、Blob 下载

期望结果

找到一种能携带自定义请求头并触发文件下载的方式。

回答

原始回答

没办法。 如果后端非要 header 带 token,那么你就使用 ajax 去接收,然后类型改成 blob,然后去下载这个资源。

AI 优化 · 回答整理

解答思路

<a href="..."> 发起的是浏览器原生请求,无法附加自定义请求头。如果后端要求必须通过请求头传递 token,就不能直接用 <a> 标签下载,而要先用 AJAX/fetch 携带请求头去请求资源,拿到二进制数据(Blob)后再触发下载。

示例代码

async function downloadWithAuth(url, token, filename) {
  const res = await fetch(url, {
    headers: {
      Authorization: `Bearer ${token}`,
    },
  });
  const blob = await res.blob();

  const link = document.createElement('a');
  link.href = URL.createObjectURL(blob);
  link.download = filename;
  link.click();
  URL.revokeObjectURL(link.href);
}

详细说明

  • 第一步:用 fetch(或 axios)发起请求,在 headers 里带上需要的 Authorization/token。
  • 第二步:把响应体以 blob 类型接收,得到文件的二进制数据。
  • 第三步:用 URL.createObjectURL(blob) 生成一个临时的本地 URL,赋给动态创建的 <a> 标签的 href,并设置 download 属性,再调用 click() 触发浏览器下载。
  • 下载完成后建议调用 URL.revokeObjectURL 释放内存。

小结

原生 <a> 标签无法携带请求头,涉及鉴权的下载场景需要先用 AJAX 请求资源并转为 Blob,再用临时 <a> 标签触发下载。

由大模型辅助整理,保留原意,补充结构与代码格式。

回答转载自 SegmentFault

评论

评论功能即将开放。你也可以通过 邮件GitHub Issue 反馈。