解决Windows + Chrome 使用Blob下载大文件时,部分情况下报错net:ERR_FAILED 200 (OK)的问题

embedded/2024/11/24 4:12:21/

背景:

部分线上用户反馈,下载文件会报错,但重启电脑又好了。测试无法复现。遂远程客户,发现在下载超过一定阈值大小的文件时,会报错。
但直接点击下载链接,可以正常下载
查阅代码,以前的写法是

function getFileBlob (url) {return request({url: url,method: 'get',responseType: 'blob'})
}
getFileBlob(url).then(res => {let eleLink = document.createElement('a')document.body.appendChild(eleLink)eleLink.download = fileNameconst uri = window.URL.createObjectURL(res)eleLink.href = urieleLink.click()window.URL.revokeObjectURL(uri)
})

这个request,是axios封装而来
基本逻辑是:先下载文件到内存(Blob)里,改名后再正常下载
Q:为什么不直接使用url下载,而是要过一遍Blob
A:直接使用url下载,eleLink.download = fileName 修改下载文件名,在非同源情况下不会生效。我们的下载走的是CDN的域名,非同源域名。

解决方案

查阅资料后,决定规避使用Blob做下载

npm install streamsaver

代码修改:

import streamSaver from 'streamsaver'fetch(url + '?response-content-type=application%2Foctet-stream', {method: 'GET',
}).then(res => {const fileStream = streamSaver.createWriteStream(fileName, { size: file.size })return res.body.pipeTo(fileStream).then(() => console.log('下载完成'))
})

问题解决

查阅资料:

Chrome’s Blob Storage System Design

Error downloading content with js [net::ERR_FAILED 200 (OK)] #306

The error “net::ERR_FAILED 200 (OK)” appears when the size of the
“blob_storage” folder in your browser profile reaches a certain limit
(which depends on the size of free disk space).

I came across this when I downloaded files with DevTools open,
inspecting the background script of an extension.

It seems that there is a bug in Chrome, because of which, while
DevTools inspects the background extension script (which executes XHRs
with xhr.responseType = “blob”; ) the cache in blob_storage is not
cleared (garbage collected).

In my case, I just needed to close DevTools.

UPD. It’s happens on common webpages too.

While DevTools is opened the cache data in “blob_storage” folder from
XMLHttpRequests with xhr.responseType = “blob”; will not be garbage
collected.

Reloading of a webpage helps.


http://www.ppmy.cn/embedded/140026.html

相关文章

数据结构(链栈——c语言实现)

链式栈(Linked Stack)是一种基于链表数据结构实现的栈。它利用链表节点的指针来存储元素,并通过指针的链接关系来维护栈的后进先出(LIFO, Last In First Out)特性。 链式栈的优点 动态大小: 链式栈…

Oracle数据库安全扫描1158/3938端口出现弱SSL加密算法解决方法之一

问题复述 某国企项目现场反应安全扫描出部署某历史项目的Windows服务器上的1158及3938两个端口出现了弱SSL加密算法漏洞,要求整改。 经过核实,该Windows服务器上部署了tomcat与Oracle 11g数据库,其中1158和3938两个端口均为Oracle数据库所使…

使用Python和OpenCV连接并处理IP摄像头视频流

使用Python和OpenCV连接并处理IP摄像头视频流 随着智能设备的发展,越来越多的家庭和企业开始使用IP摄像头进行安全监控或远程查看。这些摄像头通常可以通过网络访问,提供了丰富的功能,如实时视频流、云台控制等。本文将详细介绍如何利用Pyth…

设计模式之 桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,其核心思想是将抽象部分和实现部分分离,使它们可以独立地变化。通过桥接模式,抽象部分和实现部分可以独立扩展,从而避免了继承层次过深和高耦合的问题。 桥…

趋势洞察|AI 能否带动裸金属 K8s 强势崛起?

随着容器技术的不断成熟,不少企业在开展私有化容器平台建设时,首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器?在往期“虚拟化 vs. 裸金属*”系列文章中,我们分别对比了容器部署在虚拟化平台和物理机上的架…

使用 OpenAI 进行数据探索性分析(EDA)

探索性数据分析(Exploratory Data Analysis, 简称 EDA)是数据分析中不可或缺的环节,帮助分析师快速了解数据的分布、特征和潜在模式。传统的 EDA 通常需要手动编写代码或使用工具完成。现在,通过 OpenAI 的 GPT-4 模型&#xff0c…

【手写一个spring】spring源码的简单实现--容器启动

文章目录 前言applicationContext初始化的前置操作获取扫描路径判断是否是bean对象 前言 今天开启一个新的章节,手写一个简易版的spring,帮助大家对spring能有一个更深层次的理解. 我将分为以下几个章节进行学习: 今天先开启我们的第一个章节:容器启动. applicationContext初…

深度学习:神经网络中的非线性激活的使用

深度学习:神经网络中的非线性激活的使用 在神经网络中,非线性激活函数是至关重要的组件,它们使网络能够捕捉和模拟输入数据中的复杂非线性关系。这些激活函数的主要任务是帮助网络解决那些无法通过简单的线性操作(如权重相乘和偏…