JDK 之 研发

核心内容摘要

如何提升Android观影体验?Hanime1插件的全方位优化方案
2026年豆包Kimi写论文降AI率用哪个工具好?对比实测选了这个

GLM-OCR命令行工具开发:打造便捷的本地文档解析利器

咱福州网工仔实锤了最近为了毕设焦头烂额——要搞个能打的大文件管理系统还要兼容IE8这种“上古浏览器”学校机房那台Win7IE9的老古董点个按钮都像在玩心跳。

找了一圈后端教程不是“自己悟”就是“付费课”现在连后端代码都要自己摸着石头过河……今天先把前端代码整明白至少毕设演示时能“表面光”前端目标用原生JSWebUploader搞定10G上传断点续传文件夹咱一个后端小白后端Python还在啃《笨办法学Python》所以前端必须“能跑能用”——核心就三点兼容老浏览器IE8用FlashIE9用H5龙芯/红莲花这些信创浏览器也能跑。

断点续传关浏览器/重启电脑都不怕进度信息存本地localStorage。

文件夹上传保留层级结构比如/课程设计/文件管理系统/代码IE8手动输路径凑合用。

前端代码Vue3 WebUploader附详细注释先上干货以下是核心代码包含文件选择、分片上传、断点查询、文件夹处理注释写得贼详细小白也能看懂。

安装依赖VS Code里操作首先得装WebUploader和加密库AES加密用# 在项目根目录敲命令Vue3用npm或yarn都行npminstallwebuploader crypto-js --save

前端组件代码src/components/BigFileUpload.vueimport SparkMD5 from spark-md5; // 计算文件MD5断点续传关键 import WebUploader from webuploader; // 引入WebUploader库 import CryptoJS from crypto-js; // AES加密库传输加密 export default { data() { return { uploader: null, // WebUploader实例 progress: 0, // 上传进度百分比 isUploading: false, // 是否正在上传 currentFile: null, // 当前处理的文件 fileMd5: , // 当前文件的MD5唯一标识用于断点 chunkSize: 2 * 1024 * 1024, // 分片大小2MB10G分5000片 uploadedChunks: [], // 已上传的分片序号从本地localStorage读 encryptKey: user-defined-key-123 // 加密密钥实际项目要让用户输入 }; }, mounted() { this.initUploader(); // 初始化上传组件 }, methods: { // 初始化WebUploader兼容IE8的Flash模式 initUploader() { // 配置WebUploader重点参数注释 this.uploader WebUploader.create({ swf: /static/webuploader/Uploader.swf, // Flash路径IE8必须需提前下载 server: /api/upload/chunk, // 后端分片接收接口Python写的后面说 pick: #filePicker, // 选择文件按钮 dnd: #dndArea, // 拖拽区域 paste: document.body, // 粘贴上传可选 chunked: true, // 开启分片上传大文件必须 chunkSize: this.chunkSize, // 分片大小2MB compress: false, // 不压缩大文件压缩会丢内容 fileNumLimit: 100, // 最多同时传100个文件防崩溃 fileSizeLimit: 10 * 1024 * 1024 * 1024, // 单个文件最大10G accept: { title: All Files, extensions: * // 允许所有格式按需改 }, // 自定义参数传给后端 formData: { encrypt: true, // 告诉后端要加密传输 key: this.encryptKey // 加密密钥实际让用户输入更安全 } }); // 绑定事件文件加入队列时触发计算MD5 this.uploader.on(fileQueued, (file) { this.currentFile file; this.progress 0; this.uploadedChunks []; // 重置已上传分片 this.calculateFileMd5(file); // 计算文件MD5断点续传的核心 }); // 绑定事件分片上传前查询已上传的分片 this.uploader.on(uploadBeforeSend, (obj, data) { data.md5 this.fileMd5; // 传MD5给后端查进度 data.chunk obj.chunk; // 当前分片序号0开始 data.chunks obj.chunks; // 总分片数 }); // 绑定事件上传进度更新实时显示进度条 this.uploader.on(uploadProgress, (file, percentage) { this.progress Math.round(percentage *

; }); // 绑定事件单个分片上传成功记录已上传分片到localStorage this.uploader.on(uploadSuccess, (file, response) { if (response.code

{ const { chunk } response.data; this.uploadedChunks.push(chunk); // 记录已上传的分片序号 localStorage.setItem(upload_${this.fileMd5}, JSON.stringify(this.uploadedChunks)); // 存本地防丢失 } }); // 绑定事件全部分片上传完成合并文件 this.uploader.on(uploadFinished, (file) { this.isUploading false; this.$message.success(${file.name} 上传完成); // 清空本地存储的进度可选 localStorage.removeItem(upload_${this.fileMd5}); }); // 绑定事件上传出错提示用户 this.uploader.on(error, (type) { this.isUploading false; let msg ; switch (type) { case F_EXCEED_SIZE: msg 文件超过10G限制; break; case Q_EXCEED_NUM_LIMIT: msg 同时上传的文件太多; break; default: msg 上传失败${type}; } this.$message.error(msg); }); }, // 计算文件MD5断点续传的唯一标识 calculateFileMd5(file) { const blobSlice File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice; const chunks Math.ceil(file.size / this.chunkSize); // 总分片数 const spark new SparkMD

ArrayBuffer(); const fileReader new FileReader(); // 分片读取文件内容计算MD5大文件可能有点慢耐心等 const loadNext (currentChunk) { const start currentChunk * this.chunkSize; const end Math.min(start this.chunkSize, file.size); fileReader.readAsArrayBuffer(blobSlice.call(file, start, end)); }; fileReader.onload (e) { spark.append(e.target.result); // 累加当前分片内容 const currentChunk Math.floor(e.target.result.byteLength / this.chunkSize); if (currentChunk chunks -

{ loadNext(currentChunk); } else { this.fileMd5 spark.end(); // 所有分片读完得到最终MD5 this.queryUploadedChunks(); // 查询后端已上传的分片 } }; loadNext(

; // 开始计算 }, // 查询后端已上传的分片从localStorage或后端接口 async queryUploadedChunks() { try { // 先从localStorage找防止关浏览器后进度丢失 const localChunks localStorage.getItem(upload_${this.fileMd5}); if (localChunks) { this.uploadedChunks JSON.parse(localChunks); } else { // 没本地记录调后端接口查Python接口返回已上传的分片序号 const res await this.$http.get(/api/upload/chunks?md5${this.fileMd5}); this.uploadedChunks res.data.uploadedChunks || []; } // 告诉WebUploader跳过已上传的分片关键 this.uploader.options.chunkRetry 0; // 失败不重试已上传的分片跳过 this.uploader.upload(); // 开始上传 } catch (err) { console.error(查询已上传分片失败, err); this.$message.error(获取上传进度失败请重试); } }, // 开始上传 startUpload() { if (!this.currentFile) { this.$message.warning(请先选择文件或文件夹); return; } this.isUploading true; this.uploader.upload(); }, // 暂停上传 pauseUpload() { this.uploader.stop(); this.isUploading false; }, // 清空队列 clearQueue() { this.uploader.clearQueue(); this.progress 0; this.currentFile null; this.uploadedChunks []; } } }; .upload-container { max-width: 800px; margin: 20px auto; padding: 20px; border: 1px solid #eee; border-radius: 8px; } .placeholder { min-height: 150px; border: 2px dashed #ccc; border-radius: 4px; display: flex; flex-direction: column; align-items: center; justify-content: center; cursor: pointer; } .tip { color: #666; font-size: 12px; margin-top: 10px; } .status-bar { margin-top: 15px; } .progress-wrap { margin-bottom: 15px; } .progress-bar { width: 100%; height: 20px; background: #f3f3f3; border-radius: 10px; overflow: hidden; margin: 5px 0; } .progress { height: 100%; background: #409eff; transition: width

3s; } .btn-group button { margin-right: 10px; padding: 5px 15px; border: 1px solid #ddd; border-radius: 4px; cursor: pointer; } .btn-group button:disabled { background: #f5f5f5; color: #999; cursor: not-allowed; }代码关键功能说明小白必看兼容IE8靠WebUploader的Flash模式swf文件记得把Uploader.swf放在public/static/webuploader/目录下Vue3默认静态资源路径。

断点续传文件加入队列时用SparkMD5计算文件的MD5唯一标识。

上传前调用queryUploadedChunks从本地localStorage或后端接口查已上传的分片。

WebUploader会自动跳过已上传的分片只传未传的部分。

文件夹上传IE9支持webkitdirectory属性WebUploader自动处理拖拽文件夹时会保留层级结构比如/课程设计/文件管理系统。

IE8不支持只能手动让用户输入文件夹路径比如在文件名前加课程设计/前缀后端按路径创建文件夹。

加密传输前端用CryptoJS.AES.encrypt加密文件内容示例里没写可加在uploadBeforeSend事件里。

后端用相同的密钥解密Python代码里实现。

毕设演示

注意事项保命指南本地测试用Win7虚拟机装IE9测试文件夹上传和断点续传上传到50%时关闭浏览器重新打开继续传。

用IE8虚拟机测试Flash上传需允许浏览器运行Flash学校机房可能需要调整安全设置。

进度保存关闭浏览器再打开刷新页面看进度是否还在依赖localStorage。

大文件测试用10G的测试文件网上找“10G测试文件生成器”看分片上传是否正常有没有内存溢出。

求救后端Python怎么搞我现在后端Python还在啃大概思路是用Flask或Django写接口接收分片/api/upload/chunk。

把分片存到本地临时目录比如F:/temp_uploads/。

查uploadedChunks表或本地文件记录合并分片成完整文件。

加密存储用AES解密前端传过来的内容再存到项目目录。

有没有Python大佬愿意带带弟弟加群374992201新人有红包群里还有一起学后端的兄弟平时布置作业互相监督毕设答辩前互相调试代码PS老师说“能跑起来就行”但我争取做到“看起来很牛”——毕竟这是大学最后作业了冲就完事了将组件复制到项目中示例中已经包含此目录引入组件配置接口地址接口地址分别对应文件初始化文件数据上传文件进度文件上传完毕文件删除文件夹初始化文件夹删除文件列表参考http://www.ncmem.com/doc/view.aspx?ide1f49f3e1d4742e19135e00bd41fa3de处理事件启动测试启动成功效果数据库效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。

下载示例点击下载完整示例

怏色-怏色应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123