0

0

如何使用 Range 请求高效下载指定字节数的远程资源

心靈之曲

心靈之曲

发布时间:2026-01-19 23:16:02

|

496人浏览过

|

来源于php中文网

原创

如何使用 Range 请求高效下载指定字节数的远程资源

本文介绍如何通过 http `range` 请求头精准获取 url 资源的前 n 字节(如 1 mb),避免浏览器持续下载冗余数据,并解决重复调用时失效的问题。相比流式读取 + `reader.cancel()`,服务端支持的分块请求更可靠、可重入且无需手动缓冲拼接。

前端开发中,若仅需下载远程文件的前一部分(例如校验签名、解析头部元信息或预览内容),盲目拉取完整资源不仅浪费带宽,还可能因 fetch 流未正确终止导致后续请求失败——正如原代码中反复调用 download() 后出现的异常:reader.cancel() 并不能真正中断底层网络连接,且已消耗的响应体可能影响缓存状态或服务端连接复用,造成后续请求挂起或返回不完整响应。

推荐方案:优先使用 HTTP Range 请求

现代 Web 服务器(如 Nginx、Apache、CDN 及多数静态文件托管服务)普遍支持 Range 请求头。通过声明 Range: bytes=0-N,我们可直接向服务端申明“只需第 0 到第 N 字节”,服务端将返回 206 Partial Content 响应,且只传输指定范围的数据:

async function downloadRange(url, maxBytes) {
  try {
    const response = await fetch(url, {
      headers: {
        Range: `bytes=0-${maxBytes - 1}`
      }
    });

    if (response.status === 206) {
      // 成功获取部分数据
      const arrayBuffer = await response.arrayBuffer();
      const result = new Uint8Array(arrayBuffer);
      const str = new TextDecoder().decode(result);
      console.log(`成功下载 ${result.length} 字节:`, str.substring(0, 100) + '...');
      return result;
    } else if (response.status === 200) {
      // 服务端不支持 Range,返回了完整响应(如小文件)
      console.warn('Server does not support Range; full response received.');
      const arrayBuffer = await response.arrayBuffer();
      return new Uint8Array(arrayBuffer).slice(0, maxBytes);
    } else {
      throw new Error(`HTTP ${response.status}: ${response.statusText}`);
    }
  } catch (error) {
    console.error('Download failed:', error);
    throw error;
  }
}

优势显著

Vinteo AI
Vinteo AI

利用人工智能在逼真的室内环境中创建产品可视化。无需设计师和产品照片拍摄

下载
  • 可重入性强:每次请求都是独立的 HTTP 事务,无 reader 状态残留;
  • 零内存缓冲开销:无需 chunks 数组累积、无需手动 Uint8Array.set() 拼接;
  • 服务端协同节能:真正阻止多余字节下发,降低服务器与网络负载;
  • 语义清晰:符合 HTTP/1.1 规范,调试时可通过 DevTools → Network 面板直观查看 206 Partial Content 及 Content-Range 响应头。

⚠️ 注意事项与兜底策略

  • 检查服务端支持性:并非所有服务都启用 Accept-Ranges: bytes。可在首次请求前发起 HEAD 探测:
    async function supportsRange(url) {
      const headRes = await fetch(url, { method: 'HEAD' });
      return headRes.headers.get('accept-ranges')?.toLowerCase() === 'bytes';
    }
  • 处理小文件边界:若文件总大小
  • 不支持 Range 时的降级:可结合 AbortController 实现流式中断(需注意其兼容性):
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), 5000); // 超时保护
    const response = await fetch(url, { signal: controller.signal });
    // ... 后续用 reader.read() + bytesRead 判断,但务必 clearTimeout(timeoutId)

综上,优先采用 Range 请求是解决“下载前 N 字节”问题的最佳实践。它简洁、标准、高效且健壮。仅当明确确认目标服务不支持分块时,再考虑基于 ReadableStream 的流控方案,并务必配合 AbortController 与超时机制增强鲁棒性。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

230

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

499

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

498

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

227

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

333

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3508

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 8.9万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

Vue 教程
Vue 教程

共42课时 | 6.8万人学习

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

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