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

Vue.js如何通过WebUploader控件解决汽车制造局域网CAD图纸的超大附件分片断点?

前端老炮的20G文件夹上传大冒险附部分代码各位前端同仁们我是老张一个在辽宁苦哈哈写代码的前端民工。最近接了个活客户要求用原生JS实现20G文件夹上传下载还要支持IE9这简直是要了我这把老骨头的命啊不过为了那100块预算划掉为了技术理想我决定拼了项目背景哭诉版客户要求20G大文件上传这是要上传整个硬盘吗文件夹上传保留层级结构1000个分类的文件这是要搞文件管理系统吗支持SM4/AES加密这是要搞国家机密吗断点续传用户重启电脑都不能丢进度这是要我做操作系统吗兼容IE9现在还有人用IE9哦是Windows 7用户好吧我理解预算100元以内这连买杯咖啡都不够啊7*24小时技术支持这是要把我当24小时客服吗3年免费维护这是要签终身合同吗技术选型妥协版经过深思熟虑我决定前端Vue3 原生JS因为客户说不能用WebUploader后端SpringBoot但我不写后端代码哈哈加密crypto-js因为IE9不支持Web Crypto API文件分片自己实现因为找不到现成的IE9兼容方案部分前端代码救命版以下是文件夹上传的核心代码其他功能你们自己实现吧逃20G文件夹上传神器IE9兼容版 body { font-family: Microsoft YaHei, sans-serif; margin: 20px; } .progress-container { width: 100%; background: #f0f0f0; margin: 10px 0; } .progress-bar { height: 20px; background: #4CAF50; width: 0%; text-align: center; line-height: 20px; color: white; } .file-list { margin-top: 20px; border: 1px solid #ddd; padding: 10px; max-height: 300px; overflow-y: auto; } 20G文件夹上传神器IE9兼容版 选择文件夹 开始上传 暂停上传 0% 文件列表 // 全局变量IE9兼容的类实现 var FileUploader { files: [], chunkSize: 5 * 1024 * 1024, // 5MB分片 uploadId: null, paused: false, // 初始化IE9兼容版 init: function() { document.getElementById(fileInput).addEventListener(change, this.handleFileSelect.bind(this)); // 模拟断点续传的本地存储IE9用userData或cookie这里简化用localStorage if (!localStorage.getItem(uploadProgress)) { localStorage.setItem(uploadProgress, JSON.stringify({})); } }, // 处理文件夹选择IE9兼容版 handleFileSelect: function(e) { this.files []; var fileList e.target.files; // 递归构建文件树IE9没有File.webkitRelativePath需要特殊处理 for (var i 0; i fileList.length; i) { var file fileList[i]; // 这里简化处理实际需要解析webkitRelativePath或手动构建路径 // 兼容IE9的替代方案让用户先压缩成zip...开玩笑的 this.files.push({ file: file, path: file.name, // 实际应该用webkitRelativePath uploaded: 0, total: file.size, chunks: Math.ceil(file.size / this.chunkSize), uploadedChunks: 0 }); } this.renderFileList(); }, // 渲染文件列表IE9兼容版 renderFileList: function() { var list document.getElementById(fileList); list.innerHTML ; for (var i 0; i this.files.length; i) { var file this.files[i]; var item document.createElement(li); item.innerHTML file.path ( this.formatFileSize(file.uploaded) / this.formatFileSize(file.total) ); list.appendChild(item); } }, // 格式化文件大小IE9兼容版 formatFileSize: function(bytes) { if (bytes 0) return 0 Bytes; var k 1024; var sizes [Bytes, KB, MB, GB]; var i Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) sizes[i]; }, // 开始上传IE9兼容版 startUpload: function() { if (this.files.length 0) { alert(请先选择文件夹); return; } this.paused false; this.uploadId new Date().getTime(); // 简单生成上传ID // 加载之前的上传进度 var progressData JSON.parse(localStorage.getItem(uploadProgress)); for (var i 0; i this.files.length; i) { var file this.files[i]; var fileId file.path; // 实际应该用更唯一的ID // 如果有之前的上传记录从断点继续 if (progressData[fileId] progressData[fileId].uploadId this.uploadId) { file.uploaded progressData[fileId].uploaded; file.uploadedChunks progressData[fileId].uploadedChunks; } else { progressData[fileId] { uploadId: this.uploadId, uploaded: 0, uploadedChunks: 0 }; } } localStorage.setItem(uploadProgress, JSON.stringify(progressData)); this.uploadNextChunk(); }, // 上传下一个分片IE9兼容版 uploadNextChunk: function() { if (this.paused) return; var fileToUpload null; var fileIndex -1; // 查找下一个需要上传的分片 for (var i 0; i this.files.length; i) { var file this.files[i]; if (file.uploadedChunks file.chunks) { fileToUpload file; fileIndex i; break; } } if (!fileToUpload) { alert(上传完成); return; } var chunkIndex fileToUpload.uploadedChunks; var start chunkIndex * this.chunkSize; var end Math.min(start this.chunkSize, fileToUpload.total); var chunk fileToUpload.file.slice(start, end); // 加密分片IE9兼容版 var encryptedChunk this.encryptData(chunk, secret-key-123); // 实际应该用用户提供的密钥 // 模拟上传实际应该用XMLHttpRequest或ActiveXObject for IE9 console.log(上传分片:, fileToUpload.path, 分片, chunkIndex, /, fileToUpload.chunks); // 更新进度IE9兼容版 fileToUpload.uploadedChunks; fileToUpload.uploaded end; // 保存上传进度 var progressData JSON.parse(localStorage.getItem(uploadProgress)); var fileId fileToUpload.path; progressData[fileId] { uploadId: this.uploadId, uploaded: fileToUpload.uploaded, uploadedChunks: fileToUpload.uploadedChunks }; localStorage.setItem(uploadProgress, JSON.stringify(progressData)); // 更新UI this.renderFileList(); this.updateProgressBar(); // 继续上传下一个分片使用setTimeout模拟异步 var self this; setTimeout(function() { self.uploadNextChunk(); }, 100); // 模拟网络延迟 }, // 加密数据IE9兼容版 encryptData: function(data, key) { // 实际应该用SM4或AES这里简化用CryptoJS的AES // IE9需要额外处理ArrayBuffer到WordArray的转换 if (data instanceof Blob) { return new Promise(function(resolve) { var reader new FileReader(); reader.onload function(e) { var words CryptoJS.enc.Latin1.parse(e.target.result); var encrypted CryptoJS.AES.encrypt(words, key).toString(); resolve(encrypted); }; reader.readAsBinaryString(data); }); } // 简化处理实际需要更复杂的实现 return CryptoJS.AES.encrypt(data, key).toString(); }, // 暂停上传IE9兼容版 pauseUpload: function() { this.paused true; alert(上传已暂停); }, // 更新进度条IE9兼容版 updateProgressBar: function() { var totalUploaded this.files.reduce(function(sum, file) { return sum file.uploaded; }, 0); var totalSize this.files.reduce(function(sum, file) { return sum file.total; }, 0); var percent Math.round((totalUploaded / totalSize) * 100); document.getElementById(progressBar).style.width percent %; document.getElementById(progressBar).innerHTML percent %; } }; // 初始化页面加载时执行 window.onload function() { FileUploader.init(); // 兼容IE9的console.logIE9没有console对象时 if (!window.console) { window.console { log: function() {} }; } }; // 暴露全局方法IE9兼容 window.startUpload function() { FileUploader.startUpload(); }; window.pauseUpload function() { FileUploader.pauseUpload(); };开发心得吐槽版IE9兼容性这简直是一场噩梦没有File API没有Promise没有const/let没有箭头函数…我感觉自己在用石器时代的工具开发火箭。文件夹上传现代浏览器有webkitRelativePath但IE9没有。解决方案要么让用户先压缩成zip要么…算了还是压缩吧客户肯定不同意。断点续传localStorage在IE9中只有5MB限制存储大量上传进度呵呵祝你好运。加密传输IE9不支持Web Crypto API只能用crypto-js这种老库性能感人。20G文件分片上传是必须的但IE9的内存管理…算了别让浏览器崩溃就是胜利。加入我们的接单群广告版各位同仁如果你也在为这些奇葩需求头疼或者想找项目合作欢迎加入我们的QQ群374992201群内福利1~99元超级大红包每天都有接单合作机会技术交流分享推荐项目拿20%提成超级会员50%提成躺着赚钱免责声明求生版以上代码仅供娱乐参考实际项目中请使用成熟的库如WebUploader、Plupload等考虑使用Flash作为IE9的备选方案对于20G文件建议使用专业的大文件传输方案加密传输请使用标准协议如TLS而非前端加密断点续传最好由后端实现最后祝大家项目顺利少遇奇葩需求如果真有客户找上门记得推荐给我啊手动狗头将组件复制到项目中示例中已经包含此目录引入组件配置接口地址接口地址分别对应文件初始化文件数据上传文件进度文件上传完毕文件删除文件夹初始化文件夹删除文件列表参考http://www.ncmem.com/doc/view.aspx?ide1f49f3e1d4742e19135e00bd41fa3de处理事件启动测试启动成功效果数据库效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。下载示例点击下载完整示例

相关文章:

Vue.js如何通过WebUploader控件解决汽车制造局域网CAD图纸的超大附件分片断点?

前端老炮的20G文件夹上传大冒险(附部分代码) 各位前端同仁们,我是老张,一个在辽宁苦哈哈写代码的"前端民工"。最近接了个活,客户要求用原生JS实现20G文件夹上传下载,还要支持IE9!这简…...

fanqienovel-downloader全链路解决方案:从技术架构到场景落地的完整指南

fanqienovel-downloader全链路解决方案:从技术架构到场景落地的完整指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 价值定位:重新定义数字阅读的管理范式 当你…...

MCP与Agent Skills:不是非此即彼,而是各司其职

最近在各种技术社区里,看到些有意思的讨论:“现在 Agent Skills这么灵活,MCP是不是该被淘汰了?”、“做智能体架构,直接基于MCP做能力扩展不就行了,搞Skills纯属多此一举。”说实话,这种二选一的…...

UniApp+AI智能客服实战:从零构建高效对话系统的避坑指南

最近在做一个跨平台的智能客服项目,用UniApp来打主力。过程中踩了不少坑,也总结了一些实用的经验,今天就来聊聊怎么从零开始,在UniApp里构建一个既高效又稳定的AI对话系统。我们的目标是:响应快、不掉线、多端体验一致…...

通义千问2.5-7B-Instruct新手必看:3步完成vLLM+WebUI部署,免费开箱即用

通义千问2.5-7B-Instruct新手必看:3步完成vLLMWebUI部署,免费开箱即用 想在自己的电脑上免费体验一个功能强大、响应迅速的大语言模型吗?通义千问2.5-7B-Instruct就是一个绝佳的选择。它拥有128K的超长上下文,代码和数学能力堪比…...

救命神器!万众偏爱的AI论文软件 —— 千笔写作工具

你是否曾为论文选题而发愁?是否在深夜面对空白文档毫无头绪?是否反复修改却仍不满意表达效果?论文写作的种种难题,让无数学生陷入焦虑。而如今,一款真正改变学术写作方式的AI工具——千笔AI,正在被越来越多…...

好消息!44.7TB北美洲倾斜摄影已全部入库

最近,我们已完成北美洲倾斜摄影数据的全部入库,该数据可用于在内网进行私有化离线部署。 01 44.7TB倾斜摄影数据已全部入库 北美洲倾斜摄影数据全部入库后,一共有44.7TB大小。 北美洲倾斜摄影覆盖范围 数据文件一共有13201个数据分块&…...

从理论到实践:深入解析有源滤波器的设计与应用

1. 有源滤波器的核心原理与分类 有源滤波器是现代电子系统中的关键组件,它通过运算放大器与无源元件(电阻、电容)的协同工作,实现对特定频率信号的选择性处理。与无源滤波器相比,有源滤波器最显著的优势在于能够提供信…...

VCSA 8.0.3 企业级部署与AD域深度集成实战

1. VCSA 8.0.3 企业级部署核心要点 对于企业IT架构师来说,VCSA 8.0.3的部署不仅仅是安装一个管理平台,而是构建整个虚拟化基础设施的基石。我在多个企业级项目中实施VCSA部署时发现,前期规划的质量直接决定了后期运维的难易程度。下面我就从实…...

1990-2025年我国省市县三级的逐年土地覆盖数据(9类用地/Excel/Shp格式)

土地覆盖数据是我们在各项研究中经常使用的数据。土地覆盖数据可以帮助我们确定哪儿是建设用地,哪儿是水域,哪儿是农田等!我们之前分享了武汉大学杨杰和黄昕教授发布的1985-2025年中国30米年度土地覆盖栅格数据! 为了更直观地反映…...

SAP BOM多层展开与物料类型筛选的实战应用

1. SAP BOM多层展开的核心价值 在制造业的日常运营中,BOM(物料清单)就像产品的基因图谱,记录着从原材料到成品的完整血缘关系。我处理过最复杂的BOM有17层嵌套,涉及3000多个零部件,手工整理这样的结构简直…...

【量化工具推荐】期货量化交易账户与资金查询平台对比:8款平台深度分析

一、前言 账户资金、可用资金、冻结资金等是风控与下单决策的基础。不同期货量化平台在账户与资金查询的 API、更新频率、与实盘一致性上差异明显。本文对比8款期货量化平台的账户与资金查询能力,均为期货量化专用产品。 注意:本文仅对比期货量化账户与…...

# 存算一体架构下的高效编程实践:用 Rust实现内存感知型计算任务调度

存算一体架构下的高效编程实践:用 Rust 实现内存感知型计算任务调度 在当前 AI 与边缘计算飞速发展的背景下,传统冯诺依曼架构的瓶颈日益凸显——数据搬运成本高、延迟大、能效低。而“存算一体”(Computing-in-Memory, CIM)技术正…...

shacct.dll文件丢失找不到 免费下载修复方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...

Deep3D:让普通视频焕发立体生机的深度学习工具

Deep3D:让普通视频焕发立体生机的深度学习工具 【免费下载链接】Deep3D Real-Time end-to-end 2D-to-3D Video Conversion, based on deep learning. 项目地址: https://gitcode.com/gh_mirrors/dee/Deep3D 在数字内容创作的浪潮中,3D视频以其沉浸…...

Frida 16.0.10与雷电模拟器完美搭配:手把手教你搭建移动安全测试环境

Frida 16.0.10与雷电模拟器深度整合:打造专业级移动安全测试平台 移动应用安全测试已成为开发周期中不可或缺的环节。对于安全研究人员和开发者而言,一个稳定高效的测试环境能够显著提升漏洞挖掘和逆向分析的效率。本文将详细介绍如何将Frida 16.0.10这一…...

Windows 10下用Anaconda配置pybind11环境:Python调用C++实战指南

Windows 10下用Anaconda配置pybind11环境:Python调用C实战指南 在当今数据密集型计算领域,Python因其简洁易用而广受欢迎,但性能瓶颈时常成为开发者的痛点。而C以其卓越的执行效率著称,却面临着开发周期长的挑战。pybind11这座桥梁…...

从零搭一个 AI Agent 框架,到底需要理解什么?

从零搭一个 AI Agent 框架,到底需要理解什么?Agent Reasoning Acting。一篇从 ReAct 理论到 279 行代码实现的完整拆解——三种思维模式、六大框架选型、上下文工程的核心地位,以及一个能跑 Shell、读写文件、执行 Python 的极简智能体。&a…...

Spring Boot项目实战:ShardingSphere 4.1.1与达梦数据库8.1.3分表配置全流程

Spring Boot项目实战:ShardingSphere 4.1.1与达梦数据库8.1.3分表配置全流程 在当今数据驱动的商业环境中,数据库性能优化已成为开发者必须面对的挑战。当单表数据量突破千万级时,查询响应速度明显下降,传统解决方案如索引优化、硬…...

Python零基础入门(一)

模块一第一部分:数据的“存”与“取”(变量与标识符)变量的本质1.变量是指存储数据的容器(空间),而不是数据本身赋值过程:变量名 变量值。这里的 不是数学上的等于,而是“赋予”的…...

AppleRa1n完整指南:iOS 15-16激活锁绕过的3个关键步骤

AppleRa1n完整指南:iOS 15-16激活锁绕过的3个关键步骤 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n AppleRa1n是一款专为iOS 15至16.6.1系统设计的专业激活锁绕过工具,通过整…...

手动压铆螺母,轻松解决安装难题

在现代制造业中,高效、可靠的连接技术是确保产品质量和生产效率的关键。传统制造产线中,手动工具的使用常常导致效率低下和成本增加。本文将深入探讨手动压铆螺母在实际应用中的痛点,并介绍盾川压铆螺母应用解决方案如何通过技术创新&#xf…...

M2LOrder模型在计算机组成原理教学中的趣味应用:指令集情感化

M2LOrder模型在计算机组成原理教学中的趣味应用:指令集情感化 你有没有想过,计算机执行程序的过程,其实可以像一部有情感起伏的戏剧?那些冷冰冰的二进制指令,比如加法、跳转、存储,如果它们也有“喜怒哀乐…...

时序数据库(社区版)TDengine TSDB(安装/Docker版本)

前言TDengine 的 Docker 版本 3.4.0.0 可以免费试用。你下载并运行的 Docker 镜像,对应的就是 TDetime 社区版,这个版本自带免费许可证,可以永久免费使用。推荐:当前广泛使用且较为稳妥的 TDengine Docker 版本:3.4.0.…...

革新性VC运行库管理方案:将部署效率提升83%的企业级解决方案

革新性VC运行库管理方案:将部署效率提升83%的企业级解决方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 问题象限:企业级环境中的运行…...

飞书卡片消息实战:如何用班翎流程平台打造个性化审批通知(附配置截图)

飞书卡片消息实战:如何用班翎流程平台打造个性化审批通知 当企业审批流程遇上飞书卡片消息,信息传达效率的提升往往超出预期。想象一下,财务部门的报销审批不再需要反复点击查看详情,所有关键字段——申请人、金额、事由、单据号—…...

用AI玩转卫星照片:教你用TensorFlow实现建筑物变化自动检测(2024最新版)

用AI玩转卫星照片:教你用TensorFlow实现建筑物变化自动检测(2024最新版) 当城市以惊人的速度扩张时,传统的人工目视检查卫星影像已无法满足现代化管理的需求。去年某省会城市的一次审计中发现,仅三个月内就有47处违规建…...

Linux 命令:ldconfig —— 动态链接库管理命令

本文详细讲解 Linux 动态链接库管理命令 ldconfig,包含命令简介、语法、选项、示例及注意事项,适用于安装共享库、解决库找不到问题等场景。1. 命令简介ldconfig 是一个用于管理动态链接库(共享库)的 Linux 系统命令。它的主要功能…...

华南理工预推免面试全记录:从PPT制作到专业课突击,我的90分通关秘籍

华南理工预推免面试全记录:从PPT制作到专业课突击,我的90分通关秘籍 推开华南理工大学预推免面试室大门的那一刻,我的手心微微出汗。三个月前,我和屏幕前的你一样,面对这场关乎升学命运的考核既期待又忐忑。如今以90.2…...

避坑指南:恒源云GPUSHARE平台性能与稳定性深度实测

1. 恒源云GPUSHARE平台初体验:性能落差有多大? 第一次接触恒源云GPUSHARE平台时,我带着训练图像分类模型的任务而来。按照官方宣传,这里提供从RTX 3060到A100的多款GPU选择,价格看起来也比其他平台实惠20%左右。但实际…...