网站首页 > 技术文章 正文
分片上传是将大文件分成多个小文件进行上传,每个小文件的大小通常为1MB到10MB。上传时,将每个小文件分别上传到服务器,服务器再将这些小文件合并成一个完整的大文件。这种方法可以提高上传速度,减少上传失败的可能性。
分片上传
分片上传是将大文件分成多个小文件进行上传,每个小文件的大小通常为1MB到10MB。上传时,将每个小文件分别上传到服务器,服务器再将这些小文件合并成一个完整的大文件。这种方法可以提高上传速度,减少上传失败的可能性。
断点续传
断点续传是指在上传过程中,如果上传失败或者中断了,可以从上次上传的位置继续上传。这种方法可以避免上传失败后需要重新上传整个文件的问题,节省时间和带宽。
<script>
const inp = document.querySelector('input[type="file"]')
inp.onchange = async (e) => {
const file = inp.files[0]
if (!file) {
return
}
const chunks = createChunks(file, 10 * 1024 * 1024) //10M
const hash = await fileHash(chunks)
upload(chunks, hash)
}
// 计算文件哈希值 使用第三方库SparkMD5
function fileHash(chunks) {
return new Promise((resolve, reject) => {
const spark = new SparkMD5()
function _read(i) {
if (i >= chunks.length) {
resolve(spark.end())
return // 读取完成
}
const blob = chunks[i]
const reader = new FileReader()
reader.onload = (e) => {
const bytes = e.target.result // 读取到的字节数
spark.append(bytes)
_read(i + 1)
}
reader.readAsArrayBuffer(blob)
}
_read(0)
})
}
// 将文件根据指定长度切片
function createChunks(file, chunkSize) {
const result = []
for (let i = 0; i < file.size; i += chunkSize) {
result.push(file.slice(i, i + chunkSize))
}
return result
}
// 上传
function upload(chunks, hash) {
function uploadFile(index) {
const xhr = new XMLHttpRequest()
xhr.open('POST', '/upload', true)
xhr.setRequestHeader('Content-Type', 'application/octet-stream')
xhr.setRequestHeader('X-File-Hash', hash)
xhr.setRequestHeader('X-File-Index', index)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// 文件上传完成
// 拿到回调看服务端是第几个分片
// 判断是否需要继续传 剩余分片
// 需要递归调用uploadFile()
// 完成调用合成接口通知后端merge(); 上传完成 合成文件
}
}
xhr.send(chunks[index])
}
uploadFile(0)
}
</script>
猜你喜欢
- 2025-01-05 vue 3 学习笔记 (八)——provide 和 inject 用法及原理
- 2025-01-05 vue3 学习笔记 (一)——mixin 混入
- 2025-01-05 golang+mysql+GORM学习笔记
- 2025-01-05 Vue3 学习笔记,快速初始化Vue项目及 data 函数用法学习(二)
- 2025-01-05 Web前端经典面试题(三)
- 2025-01-05 前端工具ESLint
- 2025-01-05 「React Hooks 学习笔记」useMemo
- 2025-01-05 Jquery属性——学习笔记(一)
- 2025-01-05 SwiftUI学习笔记,可视化编辑和界面布局(二)
- 2025-01-05 「React Hooks 学习笔记」useCallback
你 发表评论:
欢迎- 581℃几个Oracle空值处理函数 oracle处理null值的函数
- 576℃Oracle分析函数之Lag和Lead()使用
- 561℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 561℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 556℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 546℃【数据统计分析】详解Oracle分组函数之CUBE
- 535℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 530℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)