news 2026/4/15 15:01:23

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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依赖

启动项目

启动成功

访问及测试

默认页面接口定义

在浏览器中访问

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

示例下载

下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 21:08:36

【小程序毕设源码分享】基于php+小程序的php文山手工艺品展销平台的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/4 16:00:45

AI生成的测试用例归档:从理论到实践的最佳方案

归档在AI测试中的战略意义在AI驱动的测试环境中&#xff0c;测试用例生成速度大幅提升&#xff0c;但随之而来的管理挑战——如版本混乱、数据冗余和质量波动——凸显了归档工作的关键性。归档不仅是对用例的静态存储&#xff0c;更是确保测试资产可追溯、可复用和可审计的动态…

作者头像 李华
网站建设 2026/4/11 14:00:36

亲测好用! AI论文写作软件 千笔·专业论文写作工具 VS PaperRed 本科生必备

随着人工智能技术的快速发展&#xff0c;AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要帮手。无论是开题报告、文献综述还是正文撰写&#xff0c;越来越多的学生开始借助AI工具提升写作效率与质量。然而&#xff0c;在面对市场上种类繁多、功能各异的AI写作软件时&#…

作者头像 李华
网站建设 2026/4/10 22:14:11

汽车制造企业使用百度UE导入EXCEL参数表,如何生成动态数据图表?

Word内容粘贴及文档导入功能解决方案报告 作为公司前端技术负责人&#xff0c;我针对客户提出的Word/公众号内容粘贴及Office文档导入需求进行了全面调研与技术方案设计。以下是详细报告&#xff1a; 一、需求分析 客户核心诉求为在现有UEditor编辑器中实现&#xff1a; Wo…

作者头像 李华