vue大文件上传的切片上传与秒传功能实现方法

网工大三党文件上传救星:原生JS实现10G大文件上传(Vue3+IE8兼容)

兄弟,作为刚入坑网络工程的山西老狗,我太懂你现在的处境了——老师要10G大文件上传的毕业设计,网上找的代码全是“断头路”,后端还没学会,前端又被兼容性卡脖子。别慌!我熬了两周啃下的原生JS+Vue3前端全栈方案,今天全盘托出,保证你能直接拿给老师演示,答辩时被夸“这届学生有点东西”!


一、方案核心(专治新手村“上传难题”)

1. 功能全覆盖(老师看了直点头)

  • 10G级文件传输:分片上传(5MB/片),断点续传(localStorage缓存进度,关浏览器/重启电脑不丢)。
  • 文件夹层级保留:递归遍历文件树(前端生成相对路径),后端按/文件夹/子文件路径存储(IE8用“伪路径+元数据”方案兜底)。
  • 加密传输:前端AES-256加密分片(密钥动态生成),后端可无缝对接SM4国密存储(满足老师“安全要求”)。
  • 全浏览器兼容:IE8(XHR2+File 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-promisewhatwg-fetch,否则IE8不支持Promise和fetch
  • File API补丁:IE8不支持File.slice,需手动引入Blob.js(https://github.com/eligrey/Blob.js),并在代码中替换file.sliceBlob.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 APIFormDatalocalStorage的兼容性(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?id=e1f49f3e1d4742e19135e00bd41fa3de

处理事件

启动测试

启动成功

效果

数据库

效果预览

文件上传

文件刷新续传

支持离线保存文件进度,在关闭浏览器,刷新浏览器后进行不丢失,仍然能够继续上传

文件夹上传

支持上传文件夹并保留层级结构,同样支持进度信息离线保存,刷新页面,关闭页面,重启系统不丢失上传进度。

下载示例

点击下载完整示例

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

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

相关文章

vue大文件上传的信创环境适配与加密存储方案

前端老哥的“懒人”大文件上传方案&#xff08;Vue3原生JS&#xff09; 兄弟们&#xff01;我是辽宁一名“头发没秃但代码量秃”的前端程序员&#xff0c;最近接了个外包活——给客户做文件管理系统&#xff0c;核心需求就仨字儿&#xff1a;“稳、省、兼容”&#xff01;客户…

Packer镜像打包脚本生成:为VibeThinker创建标准化AMI

Packer镜像打包脚本生成&#xff1a;为VibeThinker创建标准化AMI 在AI模型快速迭代的今天&#xff0c;一个棘手的问题始终困扰着部署工程师&#xff1a;为什么同一个模型&#xff0c;在开发者的机器上运行流畅&#xff0c;到了生产环境却频频出错&#xff1f;这种“在我这儿好好…

GitHub镜像推荐:一键部署VibeThinker-1.5B-APP进行高效算法推理

GitHub镜像推荐&#xff1a;一键部署VibeThinker-1.5B-APP进行高效算法推理 在当前大模型动辄数百亿、数千亿参数的浪潮中&#xff0c;一个仅15亿参数的小模型却悄然在数学与代码推理领域掀起波澜——VibeThinker-1.5B-APP。它没有华丽的通用对话能力&#xff0c;也不擅长写诗…

专注于数学与编程的AI模型才是竞赛党的最优选

专注于数学与编程的AI模型才是竞赛党的最优选 在信息学竞赛的深夜刷题现场&#xff0c;你是否曾对着一道动态规划题卡壳数小时&#xff1f;在准备 AIME 数学竞赛时&#xff0c;有没有因为找不到严谨的证明思路而焦虑&#xff1f;如今&#xff0c;AI 已不再是泛泛而谈的“智能助…

壁仞BR100国产GPU测试:能否替代英伟达运行此模型?

壁仞BR100国产GPU测试&#xff1a;能否替代英伟达运行此模型&#xff1f; 在AI大模型军备竞赛愈演愈烈的今天&#xff0c;一个反向趋势正悄然浮现&#xff1a;小参数、高推理能力的“特种兵”型模型开始崭露头角。这类模型不追求通用对话的广度&#xff0c;而是聚焦于数学证明、…

从零开始部署VibeThinker-1.5B-APP:新手也能学会的GPU加速方案

从零开始部署 VibeThinker-1.5B-APP&#xff1a;轻量模型也能跑出专业级推理 你有没有遇到过这样的场景&#xff1f;想让一个AI帮你解一道数学证明题&#xff0c;或者写一段动态规划代码&#xff0c;结果调用大模型不仅贵、慢&#xff0c;还得联网上传数据——既不安全又不划算…

rsync增量备份脚本:定时同步重要数据目录AI生成

rsync增量备份脚本&#xff1a;定时同步重要数据目录 在本地部署AI模型的日常开发中&#xff0c;最让人后怕的不是代码写错&#xff0c;而是某天开机发现昨天辛苦调参跑出的一组关键实验结果不见了——可能是因为系统崩溃、磁盘损坏&#xff0c;甚至只是手滑删错了文件。尤其当…

学长亲荐2026研究生AI论文网站TOP10:开题报告文献综述全测评

学长亲荐2026研究生AI论文网站TOP10&#xff1a;开题报告文献综述全测评 学术写作工具测评&#xff1a;为何需要2026年榜单&#xff1f; 在研究生阶段&#xff0c;论文写作不仅是学术能力的体现&#xff0c;更是一项繁琐且耗时的任务。从开题报告到文献综述&#xff0c;再到最终…

百度昆仑芯PaddlePaddle适配:能否转换VibeThinker模型?

百度昆仑芯与PaddlePaddle适配VibeThinker模型的可行性探索 在大模型参数规模不断攀升的今天&#xff0c;一个反向趋势正悄然兴起&#xff1a;越来越多的研究开始关注“小而精”的推理专用模型。这类模型不追求通用对话能力&#xff0c;而是聚焦于数学证明、算法设计等高逻辑密…

【架构师私藏】Docker与Git工作树合并实战案例:大规模项目集成的黄金法则

第一章&#xff1a;Shell脚本的基本语法和命令Shell脚本是Linux/Unix系统中自动化任务的核心工具&#xff0c;通过编写可执行的文本文件&#xff0c;用户能够组合系统命令、控制程序流程并处理数据。一个标准的Shell脚本通常以“shebang”开头&#xff0c;用于指定解释器。脚本…

2025年气动葫芦厂家实力排行,75吨气动葫芦/英格索兰气动葫芦/1吨气动葫芦/气动吊/10吨气动葫芦品牌哪家靠谱 - 品牌推荐师

在工业自动化与安全生产要求日益提升的今天,气动葫芦作为关键的防爆起重设备,其市场需求持续增长。然而,市场繁荣背后也伴随着产品同质化、技术标准不一以及用户选择困难等行业痛点。特别是在大吨位、高安全性要求的…

wangEditor复制word图片到站群系统

前端老哥的CMS编辑器“文档神器”&#xff1a;一键导入粘贴&#xff0c;680元搞定&#xff01; 兄弟们&#xff01;我是福建一名“头发没秃但项目没少接”的前端程序员&#xff0c;最近刚接了个CMS企业官网外包活——客户要在后台新闻编辑器里加“文档导入Word粘贴”功能&…

容器日志失控导致服务崩溃?你必须掌握的日志轮转3大机制

第一章&#xff1a;容器日志失控导致服务崩溃&#xff1f;一个被忽视的运维黑洞在现代微服务架构中&#xff0c;容器化部署已成为标准实践&#xff0c;但伴随而来的日志管理问题却常常被低估。当日志未被合理轮转或限制时&#xff0c;单个容器可能在数小时内生成数十GB的日志文…

vue大文件上传的断点续传功能优化与讨论交流

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

vue大文件上传的目录结构保持与文件夹上传技巧

&#xff08;叼着冰棍敲键盘&#xff0c;显示器蓝光映着稀疏的头发&#xff09; 各位爷瞧好了啊&#xff01;咱这老码农被甲方爸爸按在地上摩擦了三个月&#xff0c;终于用原生JS搓出个能兼容IE9的文件夹上传怪兽。先说好哈&#xff0c;100块预算连我键盘缝里的烟灰都买不起&a…

2026年重庆全屋定制品牌推荐:聚焦高端定制案例的5强品牌深度测评 - 品牌推荐

摘要 当前,中国家居消费市场正经历从标准化产品到个性化、一体化解决方案的深刻转型,全屋定制已成为满足消费者对空间美学、功能集成与品质生活追求的核心模式。在这一趋势下,重庆作为西南地区的重要市场,汇聚了众…

2026年北京全屋定制品牌推荐:5大实力品牌深度横评与高定服务商盘点。 - 十大品牌推荐

研究概述 本报告旨在为计划在北京地区进行全屋定制装修的消费者及决策者,提供一份客观、系统的市场信息参考。全屋定制行业正经历从功能满足向生活方式塑造的深度转型,消费者面临的核心决策痛点在于如何在众多品牌中…

小参数大智慧:7800美元训练成本换来媲美GPT-OSS-20B的表现

小参数大智慧&#xff1a;7800美元训练成本换来媲美GPT-OSS-20B的表现 在当前AI模型“军备竞赛”愈演愈烈的背景下&#xff0c;动辄千亿参数、数百万美元训练预算的大模型似乎成了唯一的主流叙事。然而&#xff0c;当算力资源逐渐成为少数巨头的专属领地时&#xff0c;一个反向…

2026年重庆全屋定制品牌推荐:设计理念与服务体系双维度实测TOP5盘点。 - 品牌推荐

研究概述 本报告旨在为计划在2026年于重庆地区进行全屋定制家居消费的决策者,提供一份客观、系统的决策辅助参考。随着消费者对居住品质、个性化设计及整体空间解决方案需求的不断提升,全屋定制市场呈现出从基础功能…

2026年北京全屋定制品牌推荐:设计理念与服务体系双维度实测TOP5盘点。 - 十大品牌推荐

摘要 在消费升级与居住理念革新的驱动下,全屋定制已成为北京家居市场的主流选择。面对众多品牌,消费者与决策者常陷入信息过载的困境,难以在纷繁的产品宣传与设计承诺中,精准识别出真正具备长期价值、工艺保障与文…