网站首页 > 技术文章 正文
本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿!
大家好,我是大澈!
本文约 1100+ 字,整篇阅读约需 2 分钟。
大文件切片上传,我一般会分为4步来搞:文件切片-计算哈希值-上传管理-上传完成合并验证。其中,上传管理又可以包括:切片上传验证、上传进度记录、断点续传。
今天分享一段优质 JS 代码片段,就是关于大文件切片上传的第3部分,上传管理的简单实现。
老规矩,先阅读代码片段并思考,再看代码解析再思考,最后评论区留下你的见解!
async function uploadFile(file, url) {
const chunkSize = 10 * 1024 * 1024; // 10 MB
const chunks = fileToChunks(file, chunkSize);
const chunkHashes = await getChunksHashes(chunks);
const uploadedChunks = new Set(JSON.parse(localStorage.getItem(file.name)) || []);
for (let i = 0; i < chunks.length; i++) {
if (uploadedChunks.has(i)) {
console.log(`Chunk ${i} already uploaded`);
continue;
}
const formData = new FormData();
formData.append('chunk', chunks[i]);
formData.append('hash', chunkHashes[i]);
formData.append('index', i);
formData.append('filename', file.name);
const response = await fetch(url, {
method: 'POST',
body: formData,
});
if (response.ok) {
uploadedChunks.add(i);
localStorage.setItem(file.name, JSON.stringify([...uploadedChunks]));
} else {
throw new Error(`Failed to upload chunk ${i}`);
}
}
console.log('All chunks uploaded successfully');
}
async function getChunksHashes(chunks) {
const spark = new SparkMD5.ArrayBuffer();
const hashes = [];
for (const chunk of chunks) {
const hash = await new Promise((resolve) => {
const reader = new FileReader();
reader.onload = (event) => {
spark.append(event.target.result);
resolve(spark.end());
};
reader.readAsArrayBuffer(chunk);
});
hashes.push(hash);
}
return hashes;
}
分享原因
这段代码展示了如何在浏览器中实现文件分片上传和断点续传的功能。
通过将文件分成多个小片段逐个上传,同时利用本地存储记录上传进度,以确保在网络中断或其他原因导致上传失败的情况下,可以继续上传未完成的部分。
代码解析
1. uploadFile 函数
这个函数的目的是:将文件分片并逐片上传,同时记录上传进度以便于断点续传。
chunkSize:定义每个分片的大小,这里是10MB。
chunks:将文件分成多个分片。
chunkHashes:计算每个分片的哈希值,用于校验分片完整性。
uploadedChunks:从本地存储中读取已上传的分片索引,避免重复上传。
遍历分片,检查当前分片是否已经上传,若已上传则跳过。
创建 FormData 对象并添加分片数据、哈希值、索引和文件名,使用 fetch 将分片上传至服务器。
若上传成功,将当前分片索引记录到 uploadedChunks 中并存储到本地存储。
2. getChunksHashes 函数
这个函数的目的是:定义计算文件各个分片的哈希值,以确保上传过程中数据的完整性。
创建 SparkMD5.ArrayBuffer 实例,用于生成 MD5 哈希。
遍历分片,使用 FileReader 读取每个分片的内容并计算其哈希值。
将每个分片的哈希值存储在 hashes 数组中。
- end -
- 上一篇: 如何实现前端录音功能(前端开发语音)
- 下一篇: Vue2问题:分享一个通用多文件类型预览库
猜你喜欢
- 2024-10-10 让编辑器支持word的复制黏贴,支持截屏的黏贴
- 2024-10-10 大文件上传优化(切片、断点续传、秒传)
- 2024-10-10 你知道前端对图片的处理方式吗(前端实现图片编辑)
- 2024-10-10 JavaScript异步图像上传(javascript 异步操作)
- 2024-10-10 javascript对文件和进制操作的一些方法汇总
- 2024-10-10 Node + H5 实现大文件分片上传、断点续传
- 2024-10-10 input上传图片并压缩(vue,前端,js)
- 2024-10-10 leaflet地图截图批量导出(leaflet地图旋转)
- 2024-10-10 Spring WebSocket传递多媒体消息(websocket springmvc)
- 2024-10-10 JS上传文件判断文件类型(js如何判断文件是否存在)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)