【JS】无法获取response headers中Content-Disposition

问题复现

在这里插入图片描述

  • 从响应头中看是有 Content-Disposition 的,然后实际打印:
fetch(
  url,
  {
    method: 'GET',
    headers: {
      'content-type': 'application/json',
      'X-Requested-With': 'XMLHttpRequest',
    },
    mode: 'cors',
    credentials: 'include',
  },
)
.then((res) => {
      // 从响应头中获取 Content-Disposition
      console.log('Content-Disposition :', res.headers.get("Content-Disposition")); 	// 打印结果为 null
  })

解决方法

  • 上面问题提到的 content-disposition 打印不出来,即使服务器在协议回包里加了该字段,但因没暴露给外部,客户端就拿不到。

  • 而响应首部 Access-Control-Expose-Headers 就是控制“暴露”的开关,它列出了哪些首部可以作为响应的一部分暴露给外部。

  • 所以如果想要让客户端可以访问到其他的首部信息,服务器不仅要在heade里加入该首部,还要将它们在 Access-Control-Expose-Headers 里面列出来

  • 需要后端添加上去:

response.setHeader("Access-Control-Expose-Headers","Content-Disposition");
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在JavaScript获取`Content-Disposition`首部可以通过从HTTP响应头获取该首部来实现。 以下是一种获取`Content-Disposition`首部的示例方法: ```javascript // 假设 response 是一个 XMLHttpRequest 对象或者 Fetch API 返回的 Response 对象 const contentDispositionHeader = response.headers.get('Content-Disposition'); if (contentDispositionHeader) { // contentDispositionHeader 的值可能是 "attachment; filename=example.txt" // 在这里你可以提取出文件名 example.txt,用于后续的操作 } ``` 在这个例子,我们通过 `headers.get('Content-Disposition')` 方法来获取HTTP响应头的`Content-Disposition`首部。如果该首部存在,我们可以对其进行解析以获取有用的信息。 请注意,获取HTTP响应头的任何首部都需要注意跨域问题和CORS策略。如果HTTP响应不允许JavaScript从另一个域获取该首部,则此方法可能无法正常工作。 ### 回答2: 使用JavaScript获取Content-Disposition的步骤如下: 1. 发送HTTP请求:使用XMLHttpRequest或fetch等方法发送HTTP GET或POST请求获取文件的内容。 2. 获取HTTP响应头信息:获取响应头信息,包括Content-Disposition头部。 3. 解析Content-Disposition:使用正则表达式或字符串处理方法来从响应头提取Content-Disposition的值。 4. 提取文件名:根据Content-Disposition的值,提取文件名部分。 5. 进一步处理:根据需要进行进一步的处理,例如对文件名进行编码转换或其他操作。 下面是一个基本的JavaScript函数示例,用于获取Content-Disposition的文件名部分: ```javascript function getFileNameFromContentDisposition(contentDisposition) { var match = contentDisposition.match(/filename\*?=([^;]+)/i); if (match && match[1]) { // 文件名包含在filename*或filename字段 var fileName = match[1].trim(); // 检查是否包含编码信息 if (fileName.startsWith("UTF-8''")) { // 去除编码信息,并进行解码 fileName = decodeURIComponent(fileName.substring(7)); } return fileName; } else { // 直接从Content-Disposition提取文件名 var startIndex = contentDisposition.indexOf("filename=") + 9; var endIndex = contentDisposition.length; var encodedFileName = contentDisposition.substring(startIndex, endIndex).trim(); var fileName = decodeURIComponent(encodedFileName); return fileName; } } // 示例用法 var contentDisposition = "attachment; filename*=UTF-8''%E6%B5%8B%E8%AF%95.txt"; var fileName = getFileNameFromContentDisposition(contentDisposition); console.log(fileName); // 输出:测试.txt ``` 在上述示例,我们定义了一个名为getFileNameFromContentDisposition的函数,该函数接受Content-Disposition的值作为参数,并返回文件名部分。函数内部使用正则表达式和字符串处理方法来解析Content-Disposition,并从提取文件名。如果文件名包含编码信息,则会进行相应的解码。最后,在示例用法,我们传入一个Content-Disposition的示例值,然后打印解析得到的文件名。 ### 回答3: 在JavaScript可以使用XMLHttpRequest对象来获取服务器的响应头信息,包括content-disposition。 首先,创建一个XMLHttpRequest对象: ```javascript var xhr = new XMLHttpRequest(); ``` 然后,使用open方法来指定请求的方法和URL: ```javascript xhr.open('GET', 'your_url_here', true); ``` 接下来,设置响应类型为arraybuffer或blob,以便能够获取到完整的响应内容: ```javascript xhr.responseType = 'arraybuffer'; // 或者 'blob' ``` 然后,发送请求: ```javascript xhr.send(); ``` 当请求完成时,可以通过xhr的getResponseHeader方法来获取指定的响应头信息,例如content-disposition: ```javascript var contentDisposition = xhr.getResponseHeader('content-disposition'); ``` 注意:由于涉及到跨域请求,如果服务器端没有正确设置Access-Control-Allow-Origin头信息,浏览器会阻止获取到响应头信息。 另外,如果使用的是fetch API进行网络请求,可以使用第二个then回调函数获取响应对象,并通过响应对象的headers属性获取到相应的头信息: ```javascript fetch('your_url_here').then(function(response) { var contentDisposition = response.headers.get('content-disposition'); }); ``` 总结起来,通过创建XMLHttpRequest对象或使用fetch API,然后发送请求,最后通过相应的方法或属性来获取content-disposition信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值