0

0

解决Fetch下载0字节文件问题:CORS模式与请求头配置指南

碧海醫心

碧海醫心

发布时间:2025-10-18 10:43:12

|

267人浏览过

|

来源于php中文网

原创

解决Fetch下载0字节文件问题:CORS模式与请求头配置指南

使用fetch api下载文件时,遇到0字节文件大小通常是由于不当的cors模式配置(如`no-cors`阻止响应体访问)和请求头设置不当(如不必要的`content-type`)。本文将深入解析这些常见问题,并提供正确的fetch用法,确保文件能够被成功下载,通过移除或正确配置cors模式并精简请求头,实现可靠的文件下载功能。

在使用JavaScript的fetch方法从URL下载文件时,有时会遇到下载的文件大小为0字节的问题,即使相同的URL在浏览器中可以直接访问和下载。这通常不是URL本身的问题,而是fetch请求的配置,特别是CORS模式和请求头设置不当所致。

核心问题分析与解决方案

导致fetch下载0字节文件的两个主要原因是:

  1. mode: 'no-cors' 模式的误用
  2. 请求头中设置了不必要的 Content-Type

我们将逐一详细解释并提供解决方案。

1. 理解 mode: 'no-cors' 的影响

fetch API的 mode 选项定义了请求的CORS模式。当设置为 mode: 'no-cors' 时,它允许跨域请求,但会极大地限制JavaScript对响应的访问权限。在这种模式下,响应被认为是“不透明(opaque)”的,这意味着:

  • 你无法访问响应的HTTP状态码(response.status)。
  • 你无法访问响应头(response.headers)。
  • 最关键的是,你无法访问响应体(response.body),因此 response.blob() 或 response.json() 等方法将返回空或无法访问的数据。

这正是导致下载文件大小为0字节的根本原因。即使服务器成功发送了文件内容,no-cors 模式也阻止了客户端JavaScript读取这些内容。

解决方案:

对于需要访问响应体(如下载文件)的跨域请求,应该:

  • 移除 mode: 'no-cors' 选项: 默认情况下,如果请求是跨域的,fetch 会尝试使用 mode: 'cors'。如果服务器配置了正确的CORS策略,这将允许你访问响应体。
  • 显式设置为 mode: 'cors': 尽管通常不是必需的,但你可以明确指定 mode: 'cors' 来确保以CORS模式进行请求。

如果目标服务器没有配置CORS策略来允许你的域访问其资源,那么即使使用 mode: 'cors',请求也可能失败并抛出CORS错误,而不是返回0字节文件。在这种情况下,你需要联系服务器管理员配置CORS。

玄鲸Timeline
玄鲸Timeline

一个AI驱动的历史时间线生成平台

下载

2. 移除不必要的 Content-Type 请求头

在 GET 请求中,客户端通常不会向服务器发送请求体。因此,为 GET 请求设置 Content-Type 请求头是多余的,并且在某些情况下甚至可能导致问题。

  • Content-Type 请求头通常用于告诉服务器客户端正在发送的请求体的媒体类型(例如,当通过 POST 请求发送JSON数据时,设置为 application/json)。
  • 对于文件下载,服务器会在其响应头中设置 Content-Type 来告知客户端它正在发送的文件类型(例如 video/mp4)。客户端无需在请求中指定此头。

解决方案:

对于文件下载的 GET 请求,完全移除 headers 对象,除非你需要传递特定的认证令牌(如 Authorization)或其他自定义头。

修正后的代码示例

综合以上分析,以下是修正后的 downloadVideo 函数:

async function downloadVideo(link) {
  try {
    // 移除 mode: 'no-cors' 和不必要的 Content-Type 头
    const response = await fetch(link);

    // 检查响应是否成功
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }

    const blob = await response.blob();
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'video.mp4'; // 设置下载文件名
    document.body.appendChild(a); // 将a标签添加到DOM中才能触发click
    a.click();
    document.body.removeChild(a); // 下载后移除a标签
    URL.revokeObjectURL(url); // 释放URL对象
  } catch (error) {
    console.error('下载视频时发生错误:', error);
  }
}

// 示例调用
// downloadVideo('https://rexample'); // 将 'https://rexample' 替换为你的视频URL

代码解释:

  1. const response = await fetch(link);:这是最关键的改动。我们移除了 mode: 'no-cors' 和 headers 对象。fetch 将默认以 cors 模式处理跨域请求,并允许我们访问响应体。
  2. if (!response.ok):添加了对HTTP响应状态的检查。response.ok 为 true 表示状态码在 200-299 范围内,是成功的响应。
  3. const blob = await response.blob();:现在,由于CORS模式正确,我们可以成功地从响应中获取 Blob 对象,它包含了文件的二进制数据。
  4. 后续步骤保持不变:创建 Object URL,创建 标签,设置 href 和 download 属性,模拟点击下载,最后释放 Object URL。
  5. document.body.appendChild(a); 和 document.body.removeChild(a);:在某些浏览器环境中,为了确保 a.click() 能够正常触发下载,可能需要将 标签暂时添加到DOM中。

注意事项与最佳实践

  • CORS策略: 确保目标服务器配置了正确的CORS策略,允许你的前端应用访问其资源。如果服务器没有配置CORS,即使你的代码是正确的,请求也可能被浏览器阻止。
  • 错误处理: 始终使用 try...catch 块来捕获 fetch 请求中可能发生的网络错误或解析错误。
  • URL验证: 在调用 downloadVideo 函数之前,务必确认提供的 link 是有效的视频URL。
  • 大文件下载: 对于非常大的文件,直接将整个文件加载到内存中的 Blob 可能会消耗大量内存。在这种情况下,可以考虑使用 ReadableStream 进行流式下载,但这会使代码更复杂。
  • 用户体验: 考虑在下载过程中提供加载指示器,并在下载完成后给出成功或失败的反馈。

总结

当使用 fetch API 下载文件遇到0字节问题时,核心原因通常在于对CORS模式的误解和不必要的请求头配置。通过移除 mode: 'no-cors' 并精简 GET 请求的 headers,我们可以确保 fetch 能够正确地获取响应体,从而成功下载文件。理解CORS机制对于前端开发中的跨域资源访问至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

424

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

537

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

78

2025.09.10

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

786

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

532

2023.09.20

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3428

2024.08.14

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

438

2023.11.09

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

29

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号