航空航天需求:Vue3如何扩展WebUploader支持三维模型文件的分片校验?

news2026/3/14 8:04:48
网工大三党文件上传救星原生JS实现10G大文件上传Vue3IE8兼容兄弟作为刚入坑网络工程的山西老狗我太懂你现在的处境了——老师要10G大文件上传的毕业设计网上找的代码全是“断头路”后端还没学会前端又被兼容性卡脖子。别慌我熬了两周啃下的原生JSVue3前端全栈方案今天全盘托出保证你能直接拿给老师演示答辩时被夸“这届学生有点东西”一、方案核心专治新手村“上传难题”1. 功能全覆盖老师看了直点头10G级文件传输分片上传5MB/片断点续传localStorage缓存进度关浏览器/重启电脑不丢。文件夹层级保留递归遍历文件树前端生成相对路径后端按/文件夹/子文件路径存储IE8用“伪路径元数据”方案兜底。加密传输前端AES-256加密分片密钥动态生成后端可无缝对接SM4国密存储满足老师“安全要求”。全浏览器兼容IE8XHR2File API补丁→ Chrome/Firefox/Edge → 信创浏览器龙芯/红莲花。2. 新手友好0后端压力纯前端实现分片、加密、断点续传全在前端搞定后端只需“接收分片合并”Python/PHP/Java都能接。代码注释拉满关键步骤加注释遇到问题直接搜“注释关键词”就能解决。本地调试友好文件存F盘无需服务器用localhost就能跑通全流程。3. 学习价值高面试加分项原生JS实战不用依赖Vue/React框架直接操作DOM和浏览器API面试官问“原生JS实现上传”直接秀代码。加密算法实践手把手教你用crypto-js实现AES加密简历里写“熟悉国密算法”不是梦。兼容性调优IE8补丁、localStorage容量优化这些“边角料”是区分初级/中级程序员的关键。二、前端核心代码Vue3原生JS附详细注释1. 文件夹上传组件支持IE8信创浏览器// 兼容IE8的polyfill必须引入 import es6-promise/auto; // 补Promise import whatwg-fetch; // 补fetch if (!window.console) window.console { log: () {}, error: () {} }; // 补console // 依赖库需手动安装npm install crypto-js axios spark-md5 import CryptoJS from crypto-js; import axios from axios; import SparkMD5 from spark-md5; export default { data() { return { uploadTasks: [], // 上传任务列表核心数据 chunkSize: 5 * 1024 * 1024, // 5MB分片兼容IE8内存限制 aesKey: , // AES密钥动态生成后端可替换 currentTaskId: , // 当前上传任务的ID isUploading: false // 全局上传状态锁 }; }, mounted() { this.initAesKey(); // 初始化AES密钥首次加载时生成 this.checkResumeTasks(); // 启动时检查本地是否有未完成的任务 }, methods: { /** * 初始化AES密钥动态生成32位随机字符串 * 注意实际项目中密钥应从后端获取这里简化为前端生成 */ initAesKey() { const chars ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789; let key ; for (let i 0; i 32; i) { key chars.charAt(Math.floor(Math.random() * chars.length)); } this.aesKey key; console.log(当前AES密钥:, key); // 调试用实际需隐藏 }, /** * 触发文件选择现代浏览器选文件/文件夹 */ selectFolder() { this.$refs.fileInput.click(); }, /** * 处理文件选择兼容IE8 * param {Event} e 文件选择事件 */ handleFileSelect(e) { const files e.target.files; if (!files.length) return; // 生成唯一任务ID时间戳随机数避免重复 this.currentTaskId upload_${Date.now()}_${Math.random().toString(36).substr(2, 6)}; // 遍历文件生成上传任务IE8用伪路径 const newTasks Array.from(files).map(file ({ taskId: this.currentTaskId, fileName: file.name, // 文件名 filePath: this.getFilePath(file), // 文件路径含层级结构 totalSize: file.size, // 文件总大小 uploadedSize: 0, // 已上传大小 progress: 0, // 上传进度0-100 status: pending, // 状态pending/resuming/uploading/failed/success statusText: 等待上传, chunkIndex: 0, // 当前分片索引从0开始 totalChunks: Math.ceil(file.size / this.chunkSize), // 总分片数 file: file // 保留文件对象用于分片读取 })); this.uploadTasks newTasks; this.startUpload(newTasks[0]); // 自动开始第一个任务 }, /** * 上传下一个分片递归 * param {Object} task 当前上传任务 */ uploadNextChunk(task) { if (task.chunkIndex task.totalChunks) { // 所有分片上传完成 task.progress 100; task.status success; task.statusText 上传成功; this.isUploading false; localStorage.removeItem(upload_${task.taskId}); // 清除本地缓存 this.$message.success(${task.fileName} 上传完成); return; } // 计算当前分片的起始和结束位置 const start task.chunkIndex * this.chunkSize; const end Math.min(start this.chunkSize, task.totalSize); const chunk task.file.slice(start, end); // IE8支持File.slice // 读取分片内容并加密原生JS实现 const reader new FileReader(); reader.onload (function(chunk, task) { return function(e) { const chunkContent e.target.result; // AES加密分片密钥与后端一致 const encryptedChunk CryptoJS.AES.encrypt( CryptoJS.lib.WordArray.create(chunkContent), this.aesKey, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 } ).toString(); // 构造FormData兼容IE8 const formData new FormData(); formData.append(taskId, task.taskId); formData.append(chunkIndex, task.chunkIndex); formData.append(totalChunks, task.totalChunks); formData.append(filePath, task.filePath); formData.append(chunk, new Blob([encryptedChunk])); // 调用后端上传接口Python/PHP/Java均可 axios.post(/api/upload/chunk, formData, { headers: { Content-Type: multipart/form-data }, onUploadProgress: (e) { if (e.lengthComputable) { // 计算实时上传速度KB/s const timeDiff e.timeStamp - (task.lastTime || Date.now()); const speed (e.loaded - task.uploadedSize) / (timeDiff || 1) / 1024; task.speed speed.toFixed(2); task.lastTime e.timeStamp; // 更新进度 task.uploadedSize e.loaded; task.progress Math.round((task.uploadedSize / task.totalSize) * 100); } } }).then((res) { // 分片上传成功更新状态 task.chunkIndex; task.status uploading; task.statusText 上传中${task.chunkIndex}/${task.totalChunks}; this.uploadNextChunk(task); // 递归上传下一个分片 }).catch((err) { // 上传失败标记状态 task.status failed; task.statusText 上传失败${err.response?.data?.msg || 网络错误}; this.isUploading false; }); }.bind(this); })(chunk, task); reader.readAsArrayBuffer(chunk); // 读取分片为ArrayBuffer加密需要 }, } };三、新手必看代码调试与避坑指南1. 兼容IE8的关键操作血泪经验引入polyfill必须引入es6-promise和whatwg-fetch否则IE8不支持Promise和fetch。File API补丁IE8不支持File.slice需手动引入Blob.jshttps://github.com/eligrey/Blob.js并在代码中替换file.slice为Blob.js的方法。localStorage容量IE8的localStorage容量限制为5MB大文件进度需分块存储代码中已用taskId分key存储。2. 分片上传的核心逻辑面试必问分片大小选5MB是因为IE8内存限制太大可能导致浏览器崩溃太小会增加请求次数。断点续传通过localStorage缓存已上传的分片索引和大小重启后从该位置继续上传。加密传输前端用AES加密分片后端收到后解密再存储密钥需前后端一致实际项目中建议后端生成密钥。3. 文件夹层级保留老师最关注路径生成现代浏览器用file.webkitRelativePath获取相对路径IE8用随机生成的文件夹名兜底需用户手动输入文件夹名这里简化为随机字符串。后端存储后端按filePath字段创建目录结构如/upload_123/folder_456/file.txt确保文件层级不变。四、找工作学习资源师兄的血泪经验1. 毕业设计答辩技巧重点讲兼容性现场演示IE8上传提前装好IE8虚拟机展示“关闭浏览器→重新打开→继续上传”的全流程。强调加密功能演示加密分片的生成和解密用console.log打印加密前后的数据。突出学习价值说明“原生JS实现”是为了深入理解上传原理而不是为了“炫技”。2. 学习资源推荐MDN文档查File API、FormData、localStorage的兼容性https://developer.mozilla.org/。crypto-js文档学AES加密的使用https://github.com/brix/crypto-js。Vue3官方文档补Vue3的基础语法https://cn.vuejs.org/。3. 群里资源QQ群374992201新人红包加群即送1~99元红包手慢无。作业互助群里每天布置小作业如“实现一个文件选择按钮”学长学姐在线批改。内推机会群里有200软工/网络工程专业的学长实习/校招内推优先。兄弟这套代码你拿去练手保证答辩时老师竖大拇指有问题直接甩日志到群里老狗我24小时在线帮你改。记住不会就查文档卡壳就问群友——咱网工学子不能输将组件复制到项目中示例中已经包含此目录引入组件配置接口地址接口地址分别对应文件初始化文件数据上传文件进度文件上传完毕文件删除文件夹初始化文件夹删除文件列表参考http://www.ncmem.com/doc/view.aspx?ide1f49f3e1d4742e19135e00bd41fa3de处理事件启动测试启动成功效果数据库效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。下载示例点击下载完整示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2410448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…