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

Vue2如何结合WebUploader实现教育课件多文件分片断点续传的进度条可视化插件?

一个前端老鸟的求生之路大文件上传项目实录各位前端江湖的兄弟姐妹们我是老张一个在甘肃苦哈哈写代码的前端农民工。最近接了个史诗级外包项目客户要求之多让我这个老程序员差点把假发都薅秃了。项目需求让我怀疑人生的清单支持20G大文件上传这得传到猴年马月必须用原生JS实现WebUploader那是什么文件夹上传要保留层级结构IE9听说你想挑战我支持SM4/AES加密加密算法我只会MD5啊断点续传用户关机重启都不丢进度这是要上天啊兼容IE9到最新ChromeWindows 7用户我们还在用IE9呢预算100元客户听说程序员喝西北风就能活免费3年维护我前端实现原生JS的极限运动经过三天三夜的奋战实际是熬夜看文档喝红牛我终于用原生JS搞定了文件夹上传的核心功能。以下是部分代码拿去不谢大文件上传系统 - 老张出品 body { font-family: Microsoft YaHei, sans-serif; margin: 0; padding: 20px; } .upload-area { border: 2px dashed #ccc; padding: 20px; text-align: center; margin-bottom: 20px; } .progress-container { width: 100%; background: #f0f0f0; height: 20px; margin: 10px 0; } .progress-bar { height: 100%; background: #4CAF50; width: 0%; transition: width 0.3s; } .file-list { margin-top: 20px; max-height: 300px; overflow-y: auto; } .file-item { padding: 5px; border-bottom: 1px solid #eee; } 大文件上传系统IE9兼容版 拖拽文件或文件夹到这里或点击选择文件 选择文件/文件夹 准备就绪 // 全局变量存储上传状态 const uploadState { files: [], chunkSize: 5 * 1024 * 1024, // 5MB分片 uploadedChunks: new Map(), // 存储已上传的分片 cryptoKey: thisIsASecretKey123 // 简单加密密钥实际项目请用更安全的方案 }; // 初始化拖拽区域 const dropArea document.getElementById(dropArea); [dragenter, dragover, dragleave, drop].forEach(eventName { dropArea.addEventListener(eventName, preventDefaults, false); }); function preventDefaults(e) { e.preventDefault(); e.stopPropagation(); } [dragenter, dragover].forEach(eventName { dropArea.addEventListener(eventName, highlight, false); }); [dragleave, drop].forEach(eventName { dropArea.addEventListener(eventName, unhighlight, false); }); function highlight() { dropArea.style.borderColor #4CAF50; } function unhighlight() { dropArea.style.borderColor #ccc; } // 处理文件选择/拖放 dropArea.addEventListener(drop, handleDrop, false); document.getElementById(fileInput).addEventListener(change, handleFileSelect); function handleFileSelect(e) { const files Array.from(e.target.files); processFiles(files); } function handleDrop(e) { const dt e.dataTransfer; const files Array.from(dt.files); // IE9兼容处理实际IE9可能不支持webkitdirectory if (typeof dt.items ! undefined dt.items) { const items Array.from(dt.items); const folderItems items.filter(item item.webkitGetAsEntry item.webkitGetAsEntry().isDirectory); if (folderItems.length 0) { // 处理文件夹简化版实际需要递归读取 alert(检测到文件夹上传但IE9可能不支持完整功能建议使用Chrome/Firefox); } } processFiles(files); } // 处理文件简化版实际需要递归处理文件夹 function processFiles(files) { updateStatus(检测到 ${files.length} 个文件); files.forEach(file { // 简单加密文件名实际项目请用更安全的方案 const encryptedName encryptFileName(file.name); uploadState.files.push({ file: file, encryptedName: encryptedName, path: file.webkitRelativePath || file.name, // 保留路径结构 totalChunks: Math.ceil(file.size / uploadState.chunkSize), uploadedChunks: 0 }); addFileToList(file.name, file.size, file.webkitRelativePath || ); }); // 模拟上传实际项目需要调用后端API setTimeout(startUpload, 1000); } // 简单的文件名加密SM4/AES实现请自行搜索加密库 function encryptFileName(name) { // 这里只是示例实际项目请使用加密库 return btoa(name | uploadState.cryptoKey).substring(0, 12) .dat; } // 更新状态显示 function updateStatus(msg) { document.getElementById(status).textContent msg; console.log(msg); } // 添加文件到列表显示 function addFileToList(name, size, path) { const fileList document.getElementById(fileList); const fileItem document.createElement(div); fileItem.className file-item; fileItem.innerHTML div${name} (${formatFileSize(size)})/divdivstylefont-size:12px;color:#666;路径: ${path}/divdivclasschunk-progressidprogress-${name.replace(/\./g, _)}/div; fileList.appendChild(fileItem); } // 格式化文件大小 function formatFileSize(bytes) { if (bytes 0) return 0 Bytes; const k 1024; const sizes [Bytes, KB, MB, GB]; const i Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) sizes[i]; } // 开始上传简化版 function startUpload() { updateStatus(开始上传...); uploadState.files.forEach((fileInfo, index) { // 实际项目需要为每个文件创建上传任务 // 这里简化处理实际需要实现分片上传、断点续传等 // 模拟上传进度 let uploaded 0; const interval setInterval(() { uploaded Math.floor(Math.random() * 1000000); if (uploaded fileInfo.file.size) { uploaded fileInfo.file.size; clearInterval(interval); updateFileProgress(fileInfo.file.name, 100); updateStatus(文件 ${fileInfo.file.name} 上传完成); } else { const progress Math.min(100, Math.round((uploaded / fileInfo.file.size) * 100)); updateFileProgress(fileInfo.file.name, progress); } }, 200); }); } // 更新单个文件上传进度 function updateFileProgress(fileName, percent) { const progressId progress- fileName.replace(/\./g, _); const progressElem document.getElementById(progressId); if (progressElem) { progressElem.innerHTML divstylewidth: ${percent}%;height:10px;background:#4CAF50;/div; } // 更新总进度条 const totalFiles uploadState.files.length; const completedFiles uploadState.files.filter(f { // 实际项目需要根据真实上传状态判断 return true; // 这里简化处理 }).length; const overallProgress Math.round((completedFiles / totalFiles) * 100); document.getElementById(progressBar).style.width overallProgress %; } // 初始化实际项目需要从本地存储加载上传状态 document.addEventListener(DOMContentLoaded, () { updateStatus(系统就绪请选择文件或文件夹); // 模拟从本地存储加载已上传的分片信息实际项目需要实现 // loadUploadStateFromLocalStorage(); });项目感悟前端人的辛酸泪IE9兼容性这简直就是前端开发者的噩梦建议客户直接给用户发新电脑大文件上传分片上传、断点续传、加密传输每个功能都能写一篇论文文件夹结构webkitRelativePath在IE中不支持需要额外处理加密存储SM4/AES加密需要引入加密库但又要考虑IE9兼容性性能优化上传20G文件前端不崩溃已经是奇迹解决方案曲线救国劝说客户建议降低需求比如不支持IE9现在连微软都放弃了降低加密要求AES-128比SM4更容易实现增加预算100元连杯星巴克都买不了技术选型使用WebUploader虽然客户要求原生JS但可以偷偷用引入加密库crypto-js使用IndexedDB存储上传状态实现断点续传团队协作加入我的QQ群374992201加群送红包还能接私活大家一起吐槽客户分享技术解决方案组建接单团队共同承接大项目最终建议各位前端同仁遇到这种史诗级需求时先评估技术可行性再评估时间成本最后评估自己的发际线如果实在搞不定就像我一样写个简化版demo加入各种限制条件然后…跑路开玩笑的实际上我已经把客户拉进了我的QQ群让他们直接和技术大神其实就是群里的同行沟通去了。这招叫做转移矛盾共同致富PS以上代码仅供娱乐实际项目请勿直接使用否则后果自负哦~将组件复制到项目中示例中已经包含此目录引入组件配置接口地址接口地址分别对应文件初始化文件数据上传文件进度文件上传完毕文件删除文件夹初始化文件夹删除文件列表参考http://www.ncmem.com/doc/view.aspx?ide1f49f3e1d4742e19135e00bd41fa3de处理事件启动测试启动成功效果数据库效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。下载示例点击下载完整示例

相关文章:

Vue2如何结合WebUploader实现教育课件多文件分片断点续传的进度条可视化插件?

一个前端老鸟的"求生"之路:大文件上传项目实录 各位前端江湖的兄弟姐妹们,我是老张,一个在甘肃苦哈哈写代码的"前端农民工"。最近接了个"史诗级"外包项目,客户要求之多让我这个老程序员差点把假发…...

PyTorch实现线性回归:从基础到工程实践

1. 线性回归与PyTorch基础认知第一次接触PyTorch实现线性回归时,我被这个"hello world"级任务的简洁性惊艳到了。不同于传统统计学教材里复杂的公式推导,用PyTorch构建回归模型就像搭积木一样直观。线性回归作为机器学习入门的必修课&#xff…...

避开这3个坑!GD32 SPI配置CKPH/CKPL时序详解与示波器实测对比

GD32 SPI时序配置实战:从波形分析到避坑指南 调试SPI接口时,最令人头疼的莫过于配置一切正常,但数据就是传不对。上周在调试一个温湿度传感器时,我遇到了类似问题——明明按照手册配置了CPOL和CPHA参数,示波器上的波形…...

从Wi-Fi干扰到Zigbee共存:手把手教你用频谱仪分析BLE广播信道的真实环境

从Wi-Fi干扰到Zigbee共存:手把手教你用频谱仪分析BLE广播信道的真实环境 在智能家居和工业物联网的复杂无线环境中,2.4GHz频段如同一条拥挤的高速公路——Wi-Fi 6、传统蓝牙、Zigbee 3.0和BLE设备都在争夺有限的频谱资源。当你的BLE设备频繁出现连接不稳…...

【Luckfox Pico实战指南】从零搭建嵌入式Linux开发环境

1. 认识Luckfox Pico:你的第一块百元级Linux开发板 第一次拿到Luckfox Pico时,我盯着这个比信用卡还小的板子看了半天——它真的能跑完整的Linux系统?作为长期被树莓派价格劝退的开发者,这款售价不到百元的开发板确实让人眼前一亮…...

DBC属性实战:从文件解析到AUTOSAR配置的工程指南

1. DBC文件在汽车电子开发中的核心作用 第一次接触DBC文件时,我完全被里面密密麻麻的属性定义搞懵了。这就像拿到一本外文说明书,每个单词都认识,但连在一起就不知所云。直到参与了一个真实的ECU开发项目,我才真正理解DBC文件在汽…...

NVIDIA Profile Inspector终极指南:三步解锁显卡隐藏性能,告别游戏卡顿与画质不佳

NVIDIA Profile Inspector终极指南:三步解锁显卡隐藏性能,告别游戏卡顿与画质不佳 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否经常在游戏中遇到画面撕裂、帧率不稳或画…...

Smart Power 3:嵌入式开发者的高性价比电源分析工具

1. Smart Power 3 产品概述Smart Power 3是Hardkernel推出的一款面向嵌入式开发者的智能电源分析工具,售价仅45美元。与Hardkernel以往主打的各种Arm架构单板计算机(如ODROID系列)不同,这款产品专注于帮助开发者优化硬件和软件的功…...

玻璃配置与分格对幕墙热工性能的影响

玻璃配置与分格对幕墙热工性能的影响 本文介绍了软件计算幕墙热工性能的思路及方法,对比了幕墙分格大小及玻璃是否采用Low-E对幕墙热工热工的影响,分析了冬季及夏季幕墙热工性能的差异。 随着石油价格的不断上涨,能源的消耗和节约成为全世界关注的问题。幕墙作为建筑的外维…...

玻璃幕墙中影像,为何会产生畸变?

【摘要】本研究通过对玻璃的变形度测试,不同玻璃反射影像对比,中空玻璃中空层内压、温度连续监测,大气压力、温度连续监测,采集大量试验数据,通过对试验数据的分析,建立光学分析模型,推导出玻璃影像畸变三大方程,总结影响玻璃影像畸变的各种因素,并根据推导出的方程解…...

Python数据分析实战:艾姆斯住房数据集描述性统计

1. 项目概述:用艾姆斯住房数据集揭开描述性统计的面纱当你第一次拿到一份陌生的数据集时,会不会有种面对茫茫数字海洋的无力感?三年前我刚接触数据分析时就深有体会。直到我发现了描述性统计这个"数据翻译器",而艾姆斯住…...

pythonGUI--socket+Pyt开发局域网(含功能、详细介绍、分享)

1. 引入 在现代 AI 工程中,Hugging Face 的 tokenizers 库已成为分词器的事实标准。不过 Hugging Face 的 tokenizers 是用 Rust 来实现的,官方只提供了 python 和 node 的绑定实现。要实现与 Hugging Face tokenizers 相同的行为,最好的办法…...

GPU加速稀疏矩阵求解在工业过程模拟中的应用

1. 工业过程模拟的挑战与机遇在石油化工、能源生产等流程工业领域,过程模拟软件就像工程师的"数字实验室"。通过建立精确的数学模型,工程师可以在虚拟环境中测试各种工艺方案,而无需中断实际生产。这种"先模拟后实施"的工…...

离散时间系统与量化梯度估计器的误差分析

1. 离散时间系统误差分析基础在机器学习优化算法的理论分析中,离散时间系统的误差分析是理解算法稳定性和收敛性的数学基础。考虑两个离散时间系统:系统A:aₜ k(aₜ₋₁ cₜ₋₁) dₜ系统B:bₜ k bₜ₋₁ dₜ其中扰动项cₜ满…...

RWKV-7开源镜像一文详解:RWKV-7架构原生适配与对话模板实践

RWKV-7开源镜像一文详解:RWKV-7架构原生适配与对话模板实践 1. 项目概述 RWKV-7 (1.5B World)是一款专为单卡GPU优化的轻量级大模型对话工具。这个开源镜像完美适配RWKV架构的原生特性,支持全球多语言对话、流畅的流式输出以及精细化的参数调节。特别值…...

KKS-HF_Patch:解锁《Koikatsu Sunshine》完整游戏体验的终极指南

KKS-HF_Patch:解锁《Koikatsu Sunshine》完整游戏体验的终极指南 【免费下载链接】KKS-HF_Patch Automatically translate, uncensor and update Koikatsu Sunshine! 项目地址: https://gitcode.com/gh_mirrors/kk/KKS-HF_Patch 你是否正在为《Koikatsu Suns…...

卷积神经网络池化层原理与应用全解析

1. 卷积神经网络中的池化层基础认知第一次接触卷积神经网络(CNN)时,我被那些会自动提取特征的卷积核深深吸引,直到在模型架构中遇到了神秘的"Max Pooling"层——这个不包含任何可训练参数的结构,凭什么能占据神经网络的重要位置&am…...

Burp Suite实战:精准捕获微信小程序与网页API数据流

1. Burp Suite抓包基础配置 第一次接触Burp Suite抓包的朋友可能会觉得有点复杂,但其实只要跟着步骤走,很快就能上手。我自己刚开始用的时候也踩过不少坑,现在把这些经验都整理出来,希望能帮你少走弯路。 首先得确保你的Burp Suit…...

TensorRT加速Stable Diffusion的8位量化实践

1. 项目概述:TensorRT加速Stable Diffusion的8位量化实践在生成式AI领域,扩散模型已成为文本到图像生成任务的金标准。作为该领域的代表作品,Stable Diffusion XL能够根据文字描述生成分辨率高达10241024的高质量图像。但这类模型在推理过程中…...

物联网AI MicroPython实战:MQ136硫化氢传感器数据采集与智能预警

1. 从零开始认识MQ136硫化氢传感器 第一次接触工业级气体传感器时,我被各种型号和参数搞得晕头转向。直到在化工厂安全改造项目中遇到MQ136,这个火柴盒大小的器件竟能守护整个车间的安全。MQ136是专门检测硫化氢(H₂S)的半导体传感…...

第一个 C 语言编译器是怎样编写的?

首先向C语言之父Dennis Ritchie致敬!当今几乎所有的实用的编译器/解释器(以下统称编译器)都是用C语言编写的,有一些语言比如Clojure,Jython等是基于JVM或者说是用Java实现的,IronPython等是基于.NET实现的,…...

蓝牙耳机控制手机音乐的幕后功臣:一文搞懂AVRCP协议(附PASS THROUGH指令详解)

蓝牙耳机控制手机音乐的幕后功臣:AVRCP协议深度解析与实战指南 当你在通勤路上用蓝牙耳机轻触"下一曲"按钮时,背后是一套精密的无线控制协议在发挥作用。AVRCP(Audio/Video Remote Control Profile)作为蓝牙技术联盟定义…...

别再让串口通信拖慢你的STM32!用CubeMX配置DMA收发,实测性能提升50%

STM32串口DMA实战:从原理到性能调优全解析 当你的嵌入式系统需要处理高频串口数据时,是否经常遇到主程序卡顿、响应延迟的问题?传统中断方式在高速数据传输场景下就像用勺子舀干游泳池——效率低下且占用大量CPU资源。本文将带你深入STM32的D…...

前端调试进阶:除了‘禁用断点’,Chrome开发者工具里还有这些绕过debugger的冷门操作

前端调试进阶:Chrome开发者工具中绕过debugger的深度策略 调试是前端开发中不可或缺的一环,而debugger语句则是调试过程中最常见的工具之一。然而,在实际开发中,我们经常会遇到一些特殊情况:第三方库中故意设置的无限d…...

时间序列季节性分析与调整方法详解

1. 时间序列季节性分析基础时间序列数据中的季节性成分是指那些以固定周期重复出现的波动模式。在气象数据中,这种季节性表现得尤为明显——每年夏季温度升高,冬季温度降低,周而复始。理解并处理这种季节性对于提高预测模型的准确性至关重要。…...

BERT分词器定制指南:从原理到实践

1. 为什么需要定制BERT分词器BERT等预训练语言模型的核心组件之一就是分词器(Tokenizer)。虽然Hugging Face等平台提供了多语言的预训练分词器,但在以下场景中,我们需要从头训练自己的分词器:处理专业领域文本&#xf…...

AI抢人大战白热化:年薪百万难求,应届生月薪12万,你被“卷”了吗?

“我们也想要AI高手,但确实要不起。” 说这话的是北京某上市游戏公司的招聘负责人景阳,“应届生中的AI高手非常抢手。往年,招一个应届AI Golang工程师,月薪均值10-15k已经很高了。今年呢?现在这个月份,很多…...

如何备份和恢复中兴手机?4 种可靠方法

无论你使用的是中兴手机还是其他安卓设备,都要记得经常备份。备份能帮你避免不必要的麻烦,因为你可以轻松恢复丢失的数据,而不用直接从手机里尝试恢复。 因此,我们都要记得时常备份移动设备,你永远不知道何时会意外删除…...

脉冲神经网络的多级设计与能效优化实践

1. 脉冲神经网络基础与能效挑战脉冲神经网络(SNN)作为第三代人工神经网络,其核心在于模拟生物神经系统的信息处理机制。与传统人工神经网络(ANN)不同,SNN采用离散的脉冲事件作为信息载体,这种设计带来了独特的计算特性和能效优势。1.1 生物启…...

如何免费解锁WeMod专业版功能:完整教程与实战指南

如何免费解锁WeMod专业版功能:完整教程与实战指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的高昂订阅费而烦恼吗&a…...