当前位置: 首页 > article >正文

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

背景:

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

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 = fileName
	const uri = window.URL.createObjectURL(res)
	eleLink.href = uri
	eleLink.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.kler.cn/a/401356.html

相关文章:

  • 【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)
  • angular的promise实战案例
  • 最优化方法_罚函数法例题
  • A037-基于Spring Boot的二手物品交易的设计与实现
  • 深入探索Scala迭代器:实用技巧与最佳实践
  • LeetCode 445.两数相加 II
  • Spark RDD各种join算子从源码层分析实现方式
  • 发那科机器人-SYST-348 负载监视器报警(力)
  • 【漏洞复现】某UI自动打印小程序任意文件上传漏洞复现
  • docker 占用空间过大导致磁盘空间不足解决办法
  • 23种设计模式-状态(State)设计模式
  • 【深度学习|目标跟踪】DeepSort 详解
  • MATLAB深度学习(二)——如何训练一个卷积神经网路
  • 1.1 计算机系统概述
  • 小Q和小S的游戏 | BFS
  • 【C++】第九节:list
  • Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析
  • 企业供配电及用电一体化微电网能源管理系统
  • 【Linux】多用户协作
  • 深入解析TK技术下视频音频不同步的成因与解决方案
  • 计算机网络(12)介质访问控制
  • 高光谱遥感是什么?高光谱遥感数据如何处理?(基于Matlab和Python多案例解析)从小白到精通
  • 高可用服务器磁盘,如何做磁盘阵列raid5
  • docker容器之间的卷共享
  • Cenos7利用docker部署mysql报错-request canceled while waiting for connection
  • web——upload-labs——第九关——特殊字符::$DATA绕过