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

前端上传切片优化以及实现

你说的 前端上传切片优化以及实现,主要涉及到大文件分片上传(chunk upload)、并发控制、断点续传、秒传、重试机制等。下面我给你梳理一下实现思路和优化点。


🔹 场景与痛点

  • 大文件上传(>100MB):直接上传会超时或失败。

  • 网络不稳定:中断后需重传。

  • 上传速度慢:需要并发分片上传。

  • 服务端压力大:需要合理控制并发与分片大小。


🔹 基础实现流程

  1. 文件切片
    使用 Blob.slice 方法将文件分割为固定大小的分片(比如 2MB/5MB)。

    function createFileChunks(file: File, chunkSize = 2 * 1024 * 1024) {const chunks: Blob[] = [];let cur = 0;while (cur < file.size) {chunks.push(file.slice(cur, cur + chunkSize));cur += chunkSize;}return chunks;
    }
    
  2. 计算文件唯一标识(hash)
    通常用 MD5/SHA1 或者基于文件名 + 大小 + 上次修改时间。
    可以在浏览器端用 spark-md5

    import SparkMD5 from "spark-md5";async function calculateHash(chunks: Blob[]) {const spark = new SparkMD5.ArrayBuffer();for (const chunk of chunks) {const buffer = await chunk.arrayBuffer();spark.append(buffer);}return spark.end(); // 文件hash
    }
    
  3. 上传分片
    每个分片通过 FormData 上传:

    async function uploadChunk(chunk: Blob, index: number, fileHash: string) {const formData = new FormData();formData.append("chunk", chunk);formData.append("index", String(index));formData.append("fileHash", fileHash);return fetch("/upload", {method: "POST",body: formData,});
    }
    
  4. 合并文件
    前端所有分片上传完成后,调用后端 /merge 接口,通知服务端进行文件合并。


🔹 优化点

  1. 并发控制
    使用 Promise.all 并发上传,但需要限制最大并发数:

    async function limitUpload(chunks, limit = 5) {const pool: Promise<any>[] = [];let i = 0;async function run() {if (i >= chunks.length) return;const task = uploadChunk(chunks[i], i, "fileHash").then(run);pool.push(task);i++;}const workers = Array(limit).fill(null).map(run);await Promise.all(workers);
    }
    
  2. 断点续传

    • 上传前向服务端查询已上传的分片列表。

    • 跳过已完成的分片,仅上传剩余分片。

  3. 秒传

    • 上传前计算 hash

    • 询问服务端该文件是否已存在,存在则直接返回成功。

  4. 失败重试

    • 针对失败的分片,做 最多 N 次重试

    async function retry(fn, retries = 3) {while (retries--) {try {return await fn();} catch (e) {if (!retries) throw e;}}
    }
    
  5. 上传进度显示

    • 每个分片上传时用 XMLHttpRequest.onprogressfetch + ReadableStream 计算进度。

    • 进度 = 已上传分片大小 / 总文件大小。


🔹 前端完整流程

  1. 选择文件 → 切片 → 计算 hash

  2. 调用 /checkFile → 返回已上传分片。

  3. 跳过已完成分片,继续上传剩余分片(带并发控制 & 重试机制)。

  4. 上传完后请求 /merge

  5. 前端实时展示进度条。


🔹 技术选型

  • 切片与上传:原生 Blob.slice + fetch/axios

  • hash计算spark-md5(大文件可用 Web Worker 避免卡 UI)。

  • 断点续传:前端记录进度 / 服务端存储分片状态。

  • 进度显示XMLHttpRequest.onprogressaxios.onUploadProgress



文章转载自:

http://G8zYwiP1.sgxkq.cn
http://Cy09XeGP.sgxkq.cn
http://9ZPPCqcv.sgxkq.cn
http://pYaeipXm.sgxkq.cn
http://LamRYSRW.sgxkq.cn
http://kcajjA4U.sgxkq.cn
http://U5IXtKYX.sgxkq.cn
http://ItKzsTdK.sgxkq.cn
http://kVykpD5Z.sgxkq.cn
http://gTVjiohB.sgxkq.cn
http://Af2sZgZE.sgxkq.cn
http://BbPlceF6.sgxkq.cn
http://lKfWihYA.sgxkq.cn
http://pxZeX00g.sgxkq.cn
http://QSDqc6fd.sgxkq.cn
http://moCXF9Ev.sgxkq.cn
http://XbhlzeBt.sgxkq.cn
http://4AAspfOQ.sgxkq.cn
http://mgzRtZEH.sgxkq.cn
http://Lwrmw3f1.sgxkq.cn
http://EMglyfZe.sgxkq.cn
http://opROLOds.sgxkq.cn
http://krFVZC1q.sgxkq.cn
http://iF3cPeM0.sgxkq.cn
http://49ws8X2m.sgxkq.cn
http://g446nf0F.sgxkq.cn
http://tT9zWtKL.sgxkq.cn
http://3rVhDhvY.sgxkq.cn
http://WcPNkFgw.sgxkq.cn
http://5dtuoqWM.sgxkq.cn
http://www.dtcms.com/a/370784.html

相关文章:

  • 自适应滤波器:Ch1 正交性原理->维纳-霍夫方程
  • 1.5、机器学习-回归算法
  • 【基础-单选】UIAbility实例创建完成时触发的回调
  • 【YOLOv11】5.安装PyCharm
  • 从技术架构、接入路径、应用场景全梳理的智慧地产开源了
  • Javaweb 14.4 Vue3 视图渲染技术
  • 算法与数据结构实战技巧:从复杂度分析到数学优化
  • clang(clangd)与arm-linux-gcc、ARMGCC、ICCARM(IAR)、C51编译器的兼容性
  • 计算机视觉(八):开运算和闭运算
  • 工业显示器在地铁电力监控与运维中的应用
  • 集成学习 —— 梯度提升树GBDT、XGBoost
  • c++八股文1
  • CAD:注释
  • C++ 并发编程指南 并发设计模式:Actor vs. CSP (生活场景版)
  • LeetCode 468. 验证IP地址 - 详细解析
  • OpenLayers常用控件 -- 章节六:全屏控件教程
  • 7.网络虚拟化
  • 基于树莓派与Jetson Nano集群的实验边缘设备上视觉语言模型(VLMs)的性能评估与实践探索
  • AI工具深度测评与选型指南 - 文本生成与处理类
  • 【Proteus仿真】定时器控制系列仿真——LED小灯闪烁/流水灯/LED灯带控制/LED小灯实现二进制
  • 十三、计算机领域英语
  • 设计模式Design Patterns:组合Composite、命令Command、策略Strategy
  • 【Mysql-installer-community-8.0.26.0】Mysql 社区版(8.0.26.0) 在Window 系统的默认安装配置
  • 【STM32HAL-----NRF24L01】
  • cocos2d. 3.17.2 c++如何实现下载断点续传zip压缩包带进度条
  • gcloud cli 使用 impersonate模拟 服务帐号
  • leetcode 3495. 使数组元素都变为零的最少操作次数-C语言
  • 把装配想象成移动物体的问题
  • mac-intel操作系统go-stock项目(股票分析工具)安装与配置指南
  • 【问题记录】IIS 报500.19,如何解决