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

推荐订阅源

Google Online Security Blog
Google Online Security Blog
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
V
V2EX
雷峰网
雷峰网
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
F
Full Disclosure
Y
Y Combinator Blog
V
V2EX - 技术
Attack and Defense Labs
Attack and Defense Labs
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
SecWiki News
SecWiki News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The GitHub Blog
The GitHub Blog
量子位
PCI Perspectives
PCI Perspectives
S
Secure Thoughts
D
Darknet – Hacking Tools, Hacker News & Cyber Security
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
K
Kaspersky official blog
B
Blog
A
Arctic Wolf
Hacker News: Ask HN
Hacker News: Ask HN
L
LangChain Blog
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
Recent Announcements
Recent Announcements
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
D
Docker
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
The Last Watchdog
The Last Watchdog
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - Xproer-松鼠

PHP实现视频文件上传完整实例 ueditor 富文本编辑器粘贴图片时让图片居中 TinyMCE富文本编辑器粘贴图片自动上传问题解决 UEditor富文本编辑器图片粘贴和上传问题 vue项目中使用tinymce富文本编辑器实现图片上传/粘贴格式 富文本编辑器复制word文档中的图片 富文本编辑器:自己实现图片上传功能和图片粘贴上传(kindeditor) 前端上传文件或者上传文件夹 前端实现文件上传(点击+拖拽) - Xproer-松鼠 HTML5应用之文件拖拽上传 使用HTML5实现多文件上传 HTML5 文件上传的2种方式 html5实现文件批量上传组件 HTML5文件上传操作 html5中怎么实现多文件上传功能 HTML5 进阶系列:文件上传下载 html实现上传 大文件分片上传 【前后台完整版】大文件分片上传
大文件、视频分片上传,断点续传
Xproer-松鼠 · 2023-12-22 · via 博客园 - Xproer-松鼠

需求背景
再简单的需求,遇到巨大的任务量,也会变得很棘手
在项目中,难免会需要一些大的文件、视频上传,通常都会耗费很长的时间上传到服务器
然鹅,这其中不能出现任何的差错(网页刷新,关机、断网)之类的故障,一旦发生了,之前的努力都会付之东流,重新开始上传之路,这时候就体现出分片上传、断点续传的重要性了


1、分片上传
分片上传,就是将一个大的文件拆分成若干个小的文件,然后逐一进行上传,以缓解服务器的压力,
再通俗一点就是,把一张纸,撕成若干个小纸条,然后交给后端,后端再用胶水粘成一个完整的

将文件进行切割
async uploadFile (file) {
// file 获取当前上传的视频文件
let that = this
const CHUNK_SIZE = 1024 * 1024 * 20 // 每个块的大小为20MB
const chunks = Math.ceil(file.size / CHUNK_SIZE) // 计算文件分成多少块 总块数
let uploadedChunks = 0 // 已上传的块数
let uploadedBytes = 0 // 已上传的字节数
let progress = 0 // 上传进度

for (let i = 0; i < chunks; i++) {
const start = i * CHUNK_SIZE // 每块的起始位置
const end = Math.min(start + CHUNK_SIZE, file.size) // // 每块的末尾
const chunk = file.slice(start, end) // 将文件在指定的位置进行切割
const res = await that.uploadChunk(chunk, i, chunks, file.name) // 将每个模块执行上传方法
uploadedChunks++
uploadedBytes += end - start
progress = Math.floor(uploadedBytes / file.size * 20)
}

// 上传完成后的处理逻辑
console.log('上传完成')
},

上传单个模块
uploadChunk (chunk, index, totalChunks, fileName) {
let that = this
// 将chunk片段转换为File文件格式
let newChunk = new File([chunk], "分片文件", { type: "*", lastModified: Date.now() })
const formData = new FormData()
// 根据后端的需要,传参,文件上传传参:formData
formData.append('dir', 'cs')
formData.append('file', newChunk)
formData.append('blob_num', index)
formData.append('total_blob_num', totalChunks)
formData.append('blob_file_name', fileName)

return axios.post(baseURL, formData, {
headers: {
'Content-Type': 'multipart/form-data' // 文件上传格式
}
}).then(res => {
// 上传成功的处理
}).catch(err => {
console.log(err)
})
}


2、断点续传
只要弄明白了,分片上传,那断点续传就简单多了,还是前面的把文件分片

let uploadedChunks = 0 // 已上传的块数
1
每次上传的时候,给后端传一个状态(当前第几片),然后触发上传之前请求一次后端接口,看上一次给后端传了几个片段,将状态后面的片段上传给后端
这个就可以做上传的暂停,开始操作

参考文章:http://blog.ncmem.com/wordpress/2023/12/22/%e5%a4%a7%e6%96%87%e4%bb%b6%e3%80%81%e8%a7%86%e9%a2%91%e5%88%86%e7%89%87%e4%b8%8a%e4%bc%a0%ef%bc%8c%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0/

欢迎入群一起讨论