惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
V
Visual Studio Blog
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
C
Check Point Blog
D
Docker
M
MIT News - Artificial intelligence
P
Proofpoint News Feed
博客园 - 叶小钗
博客园 - 聂微东
The Cloudflare Blog
云风的 BLOG
云风的 BLOG
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
MyScale Blog
MyScale Blog
WordPress大学
WordPress大学
Engineering at Meta
Engineering at Meta
腾讯CDC
S
SegmentFault 最新的问题
博客园 - 【当耐特】

新锐博客

vscode连接cnb并推送仓库 - 新锐博客 twikoo不用token查询文章浏览量 - 新锐博客 基于Astro构建的支持对话与生图的Web应用 - 新锐博客 deepseek-v4-flash-0731使用体验 - 新锐博客 基元律动免费送68元额度 - 新锐博客 Linux更换软件源 - 新锐博客 华为鸿蒙7.0花粉beta版发布 - 新锐博客 使用测速脚本测一下服务器带宽 - 新锐博客 trae告别白嫖时代,auto也需排队了 - 新锐博客 流量不够用?大流量卡免费领 - 新锐博客 推荐一个免费在线图片处理网站 - 新锐博客 AI清理C盘的优缺点 - 新锐博客 twikoo不算bug的bug - 新锐博客 最近网站的一些变动 - 新锐博客 腾讯EO开始发多余套餐啦!速领 - 新锐博客 hi168停止对个人用户的运营 - 新锐博客 哪吒监控曝高危漏洞,请尽快升级 - 新锐博客 鱼鱼api使用教程 - 新锐博客 服务器安装Dokploy替代vercel - 新锐博客 对于近几年的电视剧的无力吐槽 - 新锐博客 关于网站被攻击的后续 - 新锐博客 使用sessionStorage给音乐播放进度存储 - 新锐博客 修复了一些bug,网站基本上趋于稳定了 - 新锐博客 AI模型掺水?如何辨别真假? - 新锐博客 感谢一九云给我防住了攻击 - 新锐博客 对一些新手使用AI编程的建议 - 新锐博客 Edgeone标记过期和直接删除有何区别? - 新锐博客 用Navigation Timing API给博客添加上加载时间 - 新锐博客 使用 Astro 自建博客,从零开始鏖战 14 小时 - 新锐博客 网站收录急剧下降,趁此机会迁移站点 - 新锐博客
IndexDB实现大文件下载的思路 - 新锐博客
莫忘 · 2026-06-15 · via 新锐博客

前言

最近都在和浏览器存储打交道,不可避免的知道了一个新的存储方式IndexDB。

介绍

IndexedDB 是浏览器内置的一个非关系型数据库,和 localStorage 不同,它可以存储大量结构化数据(包括文件和二进制数据),并且支持索引查询和事务操作。单个域名的存储上限通常在几百 MB 到几 GB,远比 localStorage 的 5MB 大得多。

常见浏览器存储方案对比:

方案容量类型适用场景
localStorage~5MB字符串小量配置、token
sessionStorage~5MB字符串会话级临时数据
Cookie4KB字符串身份标识
Cache API较大Request/Response离线缓存
IndexedDB数百MB~GB任意结构化数据大量数据、文件存储

为什么用 IndexedDB 处理大文件下载

下载大文件(比如几百 MB 的视频、压缩包)时,传统方式会遇到几个问题:

  1. 内存爆炸:如果把整个文件存在内存中(Blob),大文件会直接撑爆内存,页面卡死甚至崩溃
  2. 无法断点续传:浏览器默认下载一旦中断就要重来,用户体验很差
  3. 无法持久化:刷新页面后内存中的数据就没了

IndexedDB 恰好能解决这些问题:

  • 数据存在磁盘上,不占用内存
  • 支持事务操作,可以随时写入、读取部分数据
  • 持久化存储,刷新页面不会丢失

实现思路

核心思路很简单:分块下载 + 逐块写入 IndexedDB + 最后合并导出

整个流程分为四步:

  1. 初始化数据库:创建 IndexedDB 数据库和对象存储
  2. 分块下载:通过 HTTP Range 请求,每次下载固定大小的数据块
  3. 逐块写入:每下载完一个块,立即写入 IndexedDB
  4. 合并导出:所有块下载完成后,从 IndexedDB 读取并合并成完整文件,触发浏览器下载

结语

IndexedDB 处理大文件下载的核心优势就是不占内存 + 持久化 + 支持断点续传。相比传统方式,它让大文件下载在浏览器端变得可控且稳定。

完整流程总结:HEAD 请求获取大小 → Range 分块下载 → 逐块写入 IndexedDB → 合并 Blob 导出。这个思路同样适用于大文件上传,只不过是将”下载”换成”读取文件分片 + 上传分片”。

但是缺点也很明显,就是需要等待所有块下载完成后,才能合并导出文件。

莫忘

君子喻以义,小人喻以利

本文是原创文章,采用 CC BY-NC-SA 4.0 协议,完整转载请注明来自 新锐博客