Chrome 下载大文件报错!用 Streamsaver.js 完美填坑

简介: 本文探讨了Chrome下载大文件报“网络错误”的原因及解决方案。由于Chrome对Blob数据有大小限制,导致大文件下载失败。通过将responseType改为ArrayBuffer可临时解决1-2G文件问题,但超3G仍会崩溃。最佳方案是使用Streamsaver.js实现流式下载,边接收边保存,避免内存溢出,完美支持超大文件下载。

本文系转载,转载链接:Chrome 下载大文件报错!用 Streamsaver.js 完美填坑

前言

用 Chrome 下载大文件时,有时会弹出 “网络错误”,换其他浏览器却能正常下载。今天就来排查一下这个问题产生的原因,提供一些解决思路给大家。

一、为什么 Chrome 独有的 “大文件下载坑”?

同样的网络、同样的文件,Chrome 报错而其他浏览器正常,核心问题出在 Chrome 对 “大文件数据处理” 的特殊限制上:Chrome 处理大文件时,默认用Blob类型存储数据,但Blob对大文件有隐性限流,一旦文件超过阈值,就会触发 “网络错误” 的保护机制;而其他浏览器对Blob的限制更宽松,所以能正常下载。

二、尝试思路:把 responseType 从 Blob 换成 ArrayBuffer

如果下载的文件在 1-2G 之间,这个方法能快速解决问题,具体操作和原理如下:

1. 为什么换 ArrayBuffer 有用?

Blob像 “固定大小的纸箱”,装太大的东西会变形(触发限流);而ArrayBuffer像 “可伸缩的布袋”,能更灵活地容纳大文件数据,避开 Chrome 对Blob的限流机制。简单来说,把请求响应的数据类型从Blob改成ArrayBuffer,就能让 Chrome 正常处理 1-2G 的文件下载。

2. 注意:ArrayBuffer 不是 “万能药”

这个方法有明确的局限:当文件超过 3G 时,ArrayBuffer会占用大量内存,从而导致两种问题出现 —— 要么 Chrome 直接崩溃,要么下载的文件变成几 K / 几 B 的残缺文件,相当于 “布袋装太多东西会撑破”。如果你的文件在 3G 以内,用这个方法能临时救急;超过 3G,就需要更彻底的方案。

三、完美解决 —— 用 Streamsaver.js 实现流式下载,支持超大文件

经过多次尝试,最终发现Streamsaver.js能彻底解决问题,它就像 “给大文件开了‘绿色通道’”,通过 “流式传输” 边接收数据边保存,不占用大量内存,还能避开 Chrome 的各种限制。

1. 什么是 “流式传输”?

传统下载是 “先把整个文件收到浏览器里,再保存到本地”,就像 “先把水装满桶,再倒进盆里”,但是桶太小就会溢出;而流式传输是 “收到一点水就倒进盆里”,不用等水装满桶,既能处理超大文件,又不占用过多内存。

2. Streamsaver.js 的具体使用步骤

第一步:安装依赖

在项目中执行命令安装Streamsaver.js

npm i streamsaver

第二步:编写下载函数

在代码中引入工具并编写下载逻辑:

import streamSaver from "streamsaver"

export async function streamSaverTest(url, name) {
    var url = baseURL + url
    const currentUrl = window.location.origin;
    StreamSaver.mitm = `${currentUrl}/mitm.html?version=2.0.0`
    const fileStream = StreamSaver.createWriteStream(`${name}.zip`);
    fetch(url, {
        method: 'GET',
        headers: { 'Authorization': 'Bearer ' + getToken() },
    }).then((res) => {
        console.log('=-res', res)
        const readableStream = res.body
        if (window.WritableStream && readableStream.pipeTo) {
            return readableStream.pipeTo(fileStream).then(() => console.log('下载完成'))
        }
    })
}

3. 为什么不用 Axios,偏用 Fetch?

因为 Axios 的responseType只支持arraybufferblob等固定类型,不支持 “流(stream)”;而 Fetch 能直接获取响应的body流数据,和Streamsaver.js的流式传输完美适配。

四、总结

在建设网站的过程中,面对 Chrome 大文件下载错误,通用 Streamsaver.js 做流式下载,一般情况都可以解决问题。

相关文章
|
6月前
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
392 1
|
缓存 监控 前端开发
JavaScript 实现大文件上传的方法
【10月更文挑战第17天】通过以上步骤和方法,我们可以实现较为可靠和高效的大文件上传功能。当然,具体的实现方式还需要根据实际的应用场景和服务器要求进行调整和优化。
|
10月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
470 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
10月前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
295 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
9月前
|
缓存 JavaScript 前端开发
mapbox没有token/token失效,地图闪烁后变空白,报错Error: A valid Mapbox access token is required to use Mapbox GL JS.
本博客介绍了mapbox如何去除token验证,暴力破解mapbox的token验证机制。一劳永逸解决mapbox地图闪现一下然后变成空白,报错Error: A valid Mapbox access token is required to use Mapbox GL JS.的方法,还介绍了类似问题的具体解决思路。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
JavaScript 前端开发
Node.js 中实现多任务下载的并发控制策略
Node.js 中实现多任务下载的并发控制策略
329 15
|
JavaScript 前端开发 开发工具
【Azure Developer】使用JavaScript通过SDK进行monitor-query的client认证报错问题
AADSTS90002: Tenant 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found. Check to make sure you have the correct tenant ID and are signing into the correct cloud. Check with your subscription administrator, this may happen if there are no active subscriptions for the tenant.
127 1
|
Web App开发 数据采集 存储
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
本文探讨了如何利用Chrome DevTools Protocol (CDP) 与 Selenium WebDriver 提升浏览器自动化效率,结合代理IP技术高效采集微博数据。通过CDP,开发者可直接操作浏览器底层功能,如网络拦截、性能分析等,增强控制精度。示例代码展示了如何设置代理IP、cookie及user-agent来模拟真实用户行为,提高数据抓取成功率与稳定性。适用于需要频繁抓取互联网数据的应用场景。
1335 3
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
|
Web App开发 JSON 安全
Chrome浏览器的跨域问题
【10月更文挑战第6天】
2306 123