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

SpringMVC中如何处理百M级别大附件的上传下载?

大三狗の毕业设计求生指南(附代码)

一、项目背景

作为一只即将被"赶出校门"的程序猿,最近被毕业设计折磨得头秃——导师要求做个文件管理系统,还必须支持10G大文件上传+文件夹上传+加密存储+跨浏览器兼容。更离谱的是,导师还特意强调:“必须用原生JS实现,不能用第三方库!”(后来才知道是怕我抄代码)

现在的情况是:

  • 前端:Vue3 + 原生JS(IE8兼容模式)
  • 后端:SpringBoot(导师说这是"职场硬通货")
  • 存储:阿里云OSS(学校机房的CentOS虚拟机跑得比蜗牛还慢)
  • 浏览器:从IE8到Chrome120全兼容(包括信创浏览器这种"上古神器")
二、技术选型(狗头保命版)
  1. 上传组件

    • 百度WebUploader(已停更,但IE8支持好)
    • H5 File API(现代浏览器用)
    • 最终方案:WebUploader + H5双引擎驱动(类似混动车)
  2. 加密方案

    • 传输加密:AES-256(IE8用CryptoJS降级)
    • 存储加密:SM4(国产信创要求)
    • 密钥管理:用户密码+盐值哈希(防止导师偷看我的学习资料)
  3. 断点续传

    • 进度存储:localStorage(IE8用userData模拟)
    • 服务端记录:MySQL+Redis双保险(防止浏览器清空数据)
三、前端实现(Vue3 + 原生JS)
// FileUploader.vue(精简版)exportdefault{data(){return{progress:0,uploader:null,isIE8:!!window.ActiveXObject||"ActiveXObject"inwindow}},mounted(){this.initUploader();},methods:{initUploader(){if(this.isIE8){// IE8专属降级方案this.uploader=newIE8Uploader();}else{// 现代浏览器方案this.uploader=newWebUploader.create({swf:'/path/to/Uploader.swf',// IE8需要Flashserver:'/api/upload',chunked:true,chunkSize:5*1024*1024,// 5MB分片threads:3,formData:{cryptoType:'AES'// 默认加密算法}});}// 监听上传进度this.uploader.on('uploadProgress',(file,percentage)=>{this.progress=Math.floor(percentage*100);this.saveProgress(file.id,percentage);});},startUpload(){constfileInput=document.getElementById('fileInput');constfiles=this.isIE8?this.getIE8Files(fileInput)// IE8特殊处理:fileInput.files;Array.from(files).forEach(file=>{if(file.webkitRelativePath){// 文件夹上传处理this.handleFolder(file);}else{this.uploadFile(file);}});},// IE8获取文件(降级方案)getIE8Files(input){constfiles=[];// 这里需要写一堆ActiveXObject代码...// 省略100行IE8兼容代码...returnfiles;},// 保存进度到本地存储saveProgress(fileId,progress){try{if(this.isIE8){// IE8用userData模拟localStoragedocument.getElementById('progressStorage').setAttribute('progress',progress);}else{localStorage.setItem(`progress_${fileId}`,progress);}}catch(e){console.error('存储进度失败:',e);}}}}
四、后端实现(SpringBoot)
// FileUploadController.java@RestController@RequestMapping("/api/upload")publicclassFileUploadController{@AutowiredprivateOSSClientossClient;@AutowiredprivateRedisTemplateredisTemplate;@PostMapping("/init")publicResponseEntity>initUpload(@RequestParamStringfileName,@RequestParamlongfileSize,@RequestParam(required=false)StringcryptoType){// 生成唯一任务IDStringtaskId=UUID.randomUUID().toString();// 初始化Redis进度记录redisTemplate.opsForValue().set("upload:"+taskId+":progress","0");// 返回上传参数Mapresponse=newHashMap<>();response.put("taskId",taskId);response.put("chunkSize","5242880");// 5MBresponse.put("ossEndpoint","your-oss-endpoint");returnResponseEntity.ok(response);}@PostMapping("/chunk")publicResponseEntityuploadChunk(@RequestParamStringtaskId,@RequestParamintchunkNumber,@RequestParamStringfileMd5,@RequestParamMultipartFilefile){try{// 解密分片(这里简化处理)byte[]decrypted=CryptoUtil.decrypt(file.getBytes(),"your-secret-key");// 上传到OSSStringobjectKey="uploads/"+taskId+"/"+chunkNumber;ossClient.putObject("your-bucket",objectKey,newByteArrayInputStream(decrypted));// 更新进度redisTemplate.opsForValue().increment("upload:"+taskId+":progress");returnResponseEntity.ok().build();}catch(Exceptione){returnResponseEntity.status(500).build();}}}
五、IE8兼容血泪史
  1. 文件夹上传

    • 现代浏览器:``
    • IE8:需要用ActiveXObject遍历文件系统(需要降低安全级别)
  2. localStorage替代方案

    // IE8的userData存储(古老的黑科技)functionsaveToUserData(key,value){conststorage=document.getElementById('hiddenStorage');storage.setAttribute(key,value);storage.expires=newDate(newDate().getTime()+3600000).toUTCString();// 1小时过期storage.save('fileUploadProgress');}
  3. XMLHttpRequest降级

    // IE8的XHR实现functioncreateIE8XHR(){try{returnnewActiveXObject("Msxml2.XMLHTTP");}catch(e){try{returnnewActiveXObject("Microsoft.XMLHTTP");}catch(e){returnnull;}}}
六、项目亮点(吹牛版)
  1. 全浏览器兼容:从IE8到Chrome120无缝支持
  2. 军工级加密:AES+SM4双算法支持(导师看了都直呼专业)
  3. 企业级稳定性:Redis+MySQL双进度存储(就算地球爆炸也不丢进度)
  4. 信创环境适配:已通过龙芯浏览器测试(学校机房的国产CPU终于有用武之地了)
七、求职彩蛋

现在加入我的"毕业设计互助群"(QQ:374992201),即可获得:

  1. 完整项目源码(含IE8兼容补丁)
  2. 简历优化指导(群主亲授"如何把毕业设计吹成国家级项目")
  3. 内推机会(群内有多家IT公司HR潜伏)

特别提示:现在加群还能参与"找bug换红包"活动,每发现一个兼容性问题奖励5-20元(导师说这叫"众测")!

(最后小声说:其实这个项目还没完全跑通,但吹牛的功夫已经练得炉火纯青了…)

SQL示例

创建数据库

配置数据库连接

自动下载maven依赖

启动项目

启动成功

访问及测试

默认页面接口定义

在浏览器中访问

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

示例下载

下载完整示例

http://www.jsqmd.com/news/329537/

相关文章:

  • 打造国产化内网新基座:PageAdmin 助力构建新一代智慧警务网站集群
  • 农业信息化平台用百度UM编辑器导入WORD文档,如何解决图片粘贴后的排版问题?
  • 从模型到ECU:手搓BMS控制器的野路子
  • 310. Java Stream API -大小特性和子大小特性流
  • 【一句日历】2026年02月
  • 医疗系统用百度UMEDITOR导入WORD文档,如何处理粘贴的图片清晰度问题?
  • 教育网站如何通过百度UMEDITOR实现PPT课件中WORD图片的网页化展示?
  • 风、光、负荷出力各场景及概率、场景削减、负荷点的拉丁超立方抽样(Matlab代码实现)
  • 为什么有些人边框不用border属性
  • 计算机毕设Java快递仓库管理系统 基于Java的快递仓储信息化管理系统设计与实现 Java技术驱动的快递仓库智能管理平台开发
  • 苹果斥资20亿美元收购AI初创公司:准备把“耳语”变成换机杀手锏?
  • 深度测评10个降AI率工具 千笔·专业降AI率智能体高效降AIGC
  • 计算机毕设Java教研室管理系统设计与实现 基于Java技术的教研室信息管理系统开发与应用 Java环境下教研室综合管理平台的设计与实现
  • 基于peakcan/PCAN UDS上位机 (14229/15765) 可以开发UDS小工具
  • 开题卡住了?8个AI论文写作软件深度测评,本科生毕业论文必备工具推荐
  • 水库变形监测的单北斗GNSS系统应用解析
  • 亲测好用9个降AIGC网站推荐,千笔AI助你轻松降AI率
  • spaCy:Python与Cython中的高效文本处理库
  • 【小程序毕设全套源码+文档】php基于微信小程序的文山手工艺品展销平台设计与实现(丰富项目+远程调试+讲解+定制)
  • 【小程序毕设全套源码+文档】基于Android家庭医务助手APP的设计与实现(丰富项目+远程调试+讲解+定制)
  • 参考文献崩了?AI论文网站 千笔·专业学术智能体 VS 万方智搜AI,专科生写作新选择!
  • 【小程序毕设全套源码+文档】基于nodejs实验室教学日志系统小程序的设计与实现(丰富项目+远程调试+讲解+定制)
  • 【小程序毕设全套源码+文档】基于微信小程序的外卖点餐系统小程序设计与实现(丰富项目+远程调试+讲解+定制)
  • 【小程序毕设全套源码+文档】基于微信小程序的便民医疗服务设计与实现(丰富项目+远程调试+讲解+定制)
  • 【小程序毕设源码分享】基于nodejs实验室教学日志系统小程序(程序+文档+代码讲解+一条龙定制)
  • 【小程序毕设源码分享】基于springboot+小程序的便民医疗服务的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 计算机毕设Java基于Java的电脑DIY微信小程序 基于Java的微信小程序开发:电脑DIY配置与管理平台 Java技术驱动的电脑DIY微信小程序设计与实现
  • 汇川H5U系列PLC程序,汇川IT7000系列触摸屏 IT7100E+H5U程序 一个界面搞定...
  • 【小程序毕设源码分享】基于springboot+小程序的外卖点餐系统小程序的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 计算机毕业设计springboot勤工助学管理系统 基于Java Web的大学生勤工俭学服务系统设计与开发 高校学生助学岗位信息化管理平台的设计与实现