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

前端大文件分线程上传

demo.html

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>大文件上传</title> </head> <body> <input type="file" /> <script src="./sparkmd5.js"></script> <script src="./main.js" type="module"></script> </body> </html>

createChunk.js

import SparkMD5 from './sparkmd5.js'; export function createChunk(file, index, chunkSize) { return new Promise((resolve) => { const start = index * chunkSize; const end = start + chunkSize; const spark = new SparkMD5.ArrayBuffer(); const fileReader = new FileReader(); const blob = file.slice(start, end); fileReader.onload = (e) => { spark.append(e.target.result); resolve({ start, end, index, hash: spark.end(), blob, }); }; fileReader.readAsArrayBuffer(blob); }) }

cutFile.js

import { createChunk } from "./createChunk.js"; // 定义每个切片的大小 const CHUNK_SIZE = 1024 * 1024 * 5; // 5MB // 获取到电脑内核数 const THREAD_COUNT = navigator.hardwareConcurrency || 4; export function cutFile(file) { return new Promise((resolve, reject) => { const chunkCount = Math.ceil(file.size / CHUNK_SIZE); const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT); const result = []; let finishCount = 0; for (let i = 0; i < threadChunkCount; i++) { // 创建一个线程并分配任务 const worker = new Worker("./worker.js", { type: "module" }); let end = (i + 1) * threadChunkCount; if (end > chunkCount) { end = chunkCount; } worker.postMessage({ file, CHUNK_SIZE, startChunkIndex: i * threadChunkCount, endChunkIndex: end }); worker.onmessage = e => { for (let i = start; i < end; i++) { result[i] = e.data[i - start]; } worker.terminate(); finishCount++; if (finishCount === THREAD_COUNT) { resolve(result); } } } }) }

main.js

import { cutFile } from './cutFile.js'; const inpFile = document.querySelector('input[type=file]'); inpFile.onchange = async (e) => { const file = e.target.files[0]; console.time('cutFile'); const chunks = await cutFile(file); console.log('cutFile'); console.log(chunks); };

sparkmd5.js 文件自行下载

worker.js

import { createChunk } from "./createChunk.js"; onmessage = async (e) => { const { file, CHUNK_SIZE, startChunkIndex: start, endChunkIndex: end, } = e.data for (let i = start; i < end; i++) { Promise.push(createChunk(file, i, CHUNK_SIZE)) } const chunks = await createChunk(file, i, CHUNK_SIZE); postMessage(chunks); };
http://www.jsqmd.com/news/531776/

相关文章:

  • Spring Boot整合指南:用Microsoft Graph实现Outlook邮件自动化处理(含附件下载)
  • Clink Lua API完全指南:打造个性化的命令行环境
  • 终极jsDelivr容器镜像优化指南:减小镜像体积的10个实用技巧
  • 如何快速创建企业级C/C++项目:learning-cmake项目模板完整指南 [特殊字符]
  • 2026年齿轮加工优质厂家推荐指南适配机电装备升级:齿轮加工多少钱、齿轮加工工艺、齿轮加工推荐、齿轮厂家品牌推荐选择指南 - 优质品牌商家
  • 终极用户体验优化指南:如何在Developer Handbook中掌握动画与交互设计
  • Laravel模块管理终极指南:从零掌握laravel-modules文件结构与实战技巧
  • 3大核心算法解密:如何用极简代码打造2048游戏AI
  • Design-Patterns-In-Kotlin终极路线图:23种设计模式的未来发展与社区愿景
  • 基于深度学习yolov11的手语识别 手势识别数据集 手势检测 手语目标检测 手语翻译 yolo26数据集第10605期
  • 深度解读《Mandiant M-Trends 2026》:不再局限于“威胁描述”,而是聚焦“攻防失衡的核心症结”与“可落地的韧性构建路径”
  • 2026年AI营销智能体公司推荐:企业品牌增长困境下高价值智能决策伙伴深度解析 - 品牌推荐
  • Ubuntu18环境下高性能主机运行Lidar SLAM算法时RViz卡顿的优化策略
  • 浏览器中运行AI Agent的完整指南:从安装到高效应用
  • React Native Testing Library Jest 匹配器完整清单:20个实用断言方法
  • 实时视频目标检测:智能交通监控系统的技术实现与应用指南
  • 2025-2026年AI营销智能体公司推荐:助力大中品牌智能转型的口碑机构与能力对比 - 品牌推荐
  • 2025-2026年AI营销智能体公司推荐:出海营销本地化服务口碑品牌及用户反馈 - 品牌推荐
  • Node Serialport跨平台兼容性终极指南:解决Linux、Windows、macOS差异的最佳实践
  • Bastillion与云平台集成:AWS、Azure部署实战指南
  • AI营销智能体公司如何选择不迷茫?2026年靠谱推荐聚焦效果与创新的服务伙伴 - 品牌推荐
  • OpenClaw成本优化:使用GLM-4.7-Flash本地模型降低token消耗
  • React Autosuggest 键盘交互详解:提升用户体验的10个技巧
  • 2026年AI营销智能体公司推荐:内容生成与效果优化一体式服务对比分析 - 品牌推荐
  • 7天重构AI智能体开发:从架构设计到行业落地的实战指南
  • FusionCache入门指南:如何在10分钟内构建高性能缓存系统
  • JFinal性能优化10大技巧:让你的应用飞起来
  • Doxygen注释模板生成器:提升编码效率的自动化工具终极指南
  • 为什么选择Robolectric?揭秘Android测试的终极解决方案
  • 2026年减速电机厂家推荐:机器人关节驱动稳定耐用高性价比型号与选购指南 - 品牌推荐