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

【前端碎片记录】大文件分片上传

大文件分片上传,主要是为了提高上传效率,避免网络问题或者其他原因导致整个上传失败。

HTML部分没什么特殊代码,这里只写js代码。用原生js实现,框架中可参考实现

// 获取上传文件的 input框
const ipt = document.querySelector("input")ipt.onchange = async (e) => {// 拿到文件const file = e.target.files[0];if (!file) {return }// 通过 cutFile函数,拿到切片后的数据结果cutFile(file).then(res => {// res 是一个 切片后的结果数组// 用来上传后端// res 数据结构大概是这样// [//     {//         blob: Blob, // 分片文件数据//         end: 22222, // 当前分片的截止位置//         hash: 121212122dasd // 当前分片的hash值,用来确认哪些片段已经上传,哪些上传失败好重新上传//         index: 0, // 当前分片的索引(在所有分片中的位置)//         start: 0, // 当前分片的起始位置//     }// ]})
}// 定义 cutFile 函数
const CHUNK_SIZE = 1 * 1024 * 1024; // 每一片文件的大小 这里暂定 每片 1MB
async function cutFile(file) {let res = [];let chunkCount = Math.ceil(file.size / CHUNK_SIZE); // 向上取整,即 即算出来 5.5片 就取 6片for (let i = 0; i < chunkCount; i++) {let chunk = await createChunks(file, i, CHUNK_SIZE)res.push(chunk);}return res;
}// 创建分片辅助函数
function createChunks (file, index, chunkSize) {return new Promise((resolve) => {const start = index * chunkSize;const end = start + chunkSize; // 注意边界问题const spark = new SparkMD5(); // 用来生成文件hash,需要安装 spark-md5const fileReader = new FileReader();const blob = file.slice(start, end);fileReader.onload = e => {spark.append(e.target.result)resolve({start,end,blob,hash: spark.end(), // 这一步是同步任务,很耗时,如果分片很多,请考虑使用web worker开启多线程进行index});}fileReader.readAsArrayBuffer(blob)});
}

如果分片很多,请考虑使用web worker开启多线程进行

大致思路如上,可能有些细节在使用时需要自己调整

感谢您的阅读!

面向娃编程,自己无聊写的小程序【工具人助手】,可以做题、练字。可能有小朋友的你会需要~

在这里插入图片描述


http://www.mrgr.cn/news/48059.html

相关文章:

  • 快速理解24种设计模式
  • 嵌入式驱动开发详解21(网络驱动开发)
  • 微信小程序 不同角色进入不同页面、呈现不同底部导航栏
  • 02-18.python入门基础一基础算法
  • 2024年总结
  • 【数据结构与算法】线性表——顺序储存与单链表
  • 【selenium】webdriver测试脚本
  • 常用的web服务器简述
  • ubuntu24 finalshell 无法连接ubuntu服务器, 客户端无法连接ubuntu, 无法远程连接ubuntu。
  • go开发环境设置-安装与交叉编译
  • 【C++进阶】关联式容器map的使用
  • Ubuntu安装Apache教程
  • 排队论:根据λ(到达率)和 μ(服务率)的用户等待时间公式
  • 打开传奇提示connection closed是什么意思?怎么解决?
  • 动态爬虫管理平台构建与实现(论文+源码)_kaic
  • 小米开放式耳机好不好用?小米、南卡、倍思、飞利浦热门开放式耳机一周测评!
  • 工业4G路由R10提升物流仓储效率
  • 【系统架构设计师】案例专题六(8大系统架构设计之1): 信息系统架构设计考点梳理
  • TikTok代理IP哪里找?
  • 数据结构:快排
  • C语言基础语法——类型转换
  • 【文心智能体 | AI大师工坊】通过知识库优化智能体『万圣节之纸人还魂』:探索恐怖剧本杀的奇幻之旅
  • MySQL基本语法、高级语法知识总结以及常用语法案例
  • TON(二)编译中涉及的更多细节
  • 1234555
  • 力扣第一题:两数之和(图解版)