news 2026/8/18 15:22:36

SpringMVC大文件上传解决方案是否支持断点续传与秒传

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringMVC大文件上传解决方案是否支持断点续传与秒传

一个大三狗的文件管理系统历险记

大家好,我是福州某校软件工程专业的大三狗,眼看毕业季来临,我决定做个"惊天地泣鬼神"的文件管理系统当毕业设计(主要是为了找工作时有东西可以吹)。

我的"异想天开"需求清单

  1. 10G大文件上传:我的笔记本硬盘才512G啊喂!
  2. 加密传输+存储:这得让我的课程设计看起来像国家安全局项目
  3. 断点续传:关了浏览器还能接着传?重启电脑也不丢进度?
  4. 文件夹上传保留结构:还要支持加密传输?(我开始怀疑自己是不是大三学生了)
  5. 浏览器兼容:从IE8到国产浏览器一个都不能少
  6. 7*24小时免费技术支持:我自己都天天熬夜改bug,哪来的24小时?
  7. 免费源代码:毕竟预算=食堂饭卡余额

技术栈迷惑行为

  • 前端:Vue3(写着写着就变成jQuery了)
  • 后端:SpringBoot(Spring全家桶入门级选手)
  • 数据库:MySQL(就会个CRUD)
  • 存储:阿里云OSS(因为学生认证有优惠)
  • 开发工具:IDEA(唯一用得顺手的)

编码翻车现场

前端部分 (原生JS实现)

// 大文件分片上传(10G?先试试10M吧)classBigFileUploader{constructor(){this.chunkSize=5*1024*1024;// 5MB一片this.retryCount=3;this.queue=[];this.paused=false;}// 选择文件后的处理handleFileSelect(e){constfile=e.target.files[0];if(!file){alert('老板,您倒是选个文件啊!');return;}if(file.size>10*1024*1024*1024){alert('10G?您电脑内存够吗?');return;}this.sliceAndUpload(file);}// 文件分片sliceAndUpload(file){consttotalChunks=Math.ceil(file.size/this.chunkSize);letuploadedChunks=this.loadProgress(file.name)||0;for(leti=uploadedChunks;i<totalChunks;i++){conststart=i*this.chunkSize;constend=Math.min(file.size,start+this.chunkSize);constchunk=file.slice(start,end);this.queue.push({chunk,chunkNumber:i,totalChunks,fileName:file.name,fileSize:file.size,retry:0});}this.processQueue();}// 上传队列处理processQueue(){if(this.paused||this.queue.length===0)return;constitem=this.queue.shift();this.uploadChunk(item).then(()=>{this.saveProgress(item.fileName,item.chunkNumber+1);this.processQueue();}).catch(err=>{console.error('上传失败:',err);if(item.retry<this.retryCount){item.retry++;this.queue.unshift(item);setTimeout(()=>this.processQueue(),1000);}else{alert(`文件${item.fileName}${item.chunkNumber+1}片上传失败!`);}});}// 实际分片上传uploadChunk(item){returnnewPromise((resolve,reject)=>{constformData=newFormData();formData.append('file',item.chunk);formData.append('chunkNumber',item.chunkNumber);formData.append('totalChunks',item.totalChunks);formData.append('fileName',item.fileName);// 这里应该加上加密逻辑(但我还没学会)constxhr=newXMLHttpRequest();xhr.open('POST','/api/upload',true);xhr.onload=()=>{if(xhr.status===200){resolve(JSON.parse(xhr.responseText));}else{reject(newError('上传失败: '+xhr.statusText));}};xhr.onerror=()=>reject(newError('网络错误'));xhr.send(formData);});}// 保存进度到localStorage(不够持久?)saveProgress(fileName,uploadedChunks){constprogress=JSON.parse(localStorage.getItem('uploadProgress')||'{}');progress[fileName]=uploadedChunks;localStorage.setItem('uploadProgress',JSON.stringify(progress));}// 加载进度loadProgress(fileName){constprogress=JSON.parse(localStorage.getItem('uploadProgress')||'{}');returnprogress[fileName]||0;}}

后端部分 (SpringBoot)

@RestController@RequestMapping("/api")publicclassFileUploadController{@Value("${upload.dir}")privateStringuploadDir;@PostMapping("/upload")publicResponseEntityuploadChunk(@RequestParam("file")MultipartFilefile,@RequestParam("chunkNumber")intchunkNumber,@RequestParam("totalChunks")inttotalChunks,@RequestParam("fileName")StringfileName){try{// 创建临时目录StringtempDir=uploadDir+File.separator+"temp_"+fileName;Filedir=newFile(tempDir);if(!dir.exists()){dir.mkdirs();}// 保存分片文件StringchunkName=chunkNumber+".part";FilechunkFile=newFile(dir,chunkName);file.transferTo(chunkFile);// 如果是最后一片,合并文件if(chunkNumber==totalChunks-1){mergeFiles(fileName,tempDir,totalChunks);}returnResponseEntity.ok().body(Map.of("success",true,"message","分片上传成功","chunkNumber",chunkNumber));}catch(Exceptione){returnResponseEntity.status(500).body(Map.of("success",false,"message","分片上传失败: "+e.getMessage()));}}privatevoidmergeFiles(StringfileName,StringtempDir,inttotalChunks)throwsIOException{FileoutputFile=newFile(uploadDir,fileName);try(FileOutputStreamfos=newFileOutputStream(outputFile,true);BufferedOutputStreambos=newBufferedOutputStream(fos)){for(inti=0;i<totalChunks;i++){FilechunkFile=newFile(tempDir,i+".part");try(FileInputStreamfis=newFileInputStream(chunkFile);BufferedInputStreambis=newBufferedInputStream(fis)){byte[]buffer=newbyte[1024];intlen;while((len=bis.read(buffer))>0){bos.write(buffer,0,len);}}chunkFile.delete();// 删除已合并的分片}}// 删除临时目录newFile(tempDir).delete();}}

遇到的坑爹问题

  1. IE8兼容:2023年了还要兼容IE8?我选择放弃治疗!
  2. 10G文件上传:我的虚拟机内存才分配了4G…
  3. 断点续传持久化:localStorage根本不够用啊!
  4. 文件夹结构保持:前端获取不到完整路径,这题超纲了!
  5. 加密功能:老师教过MD5算吗?(心虚)

我的卑微请求

有没有大神能:

  1. 教我实现真正的断点续传持久化(IndexedDB?)
  2. 帮我搞定文件夹结构上传
  3. 教我简单的文件加密(别太复杂,我怕看不懂)
  4. 给我的简历加点闪光点(最好能直接帮我写)

欢迎加QQ群374992201交流!新人加群送红包!(虽然可能就1块钱)

毕业答辩生存指南

  1. 演示时只传小文件(避免当场卡死)
  2. 重点讲设计思路(代码能跑就行)
  3. 准备几个专业术语:“分布式存储”、“零信任安全模型”…
  4. 遇到不会的问题就说"这个功能在下个版本规划中"

找工作求带!
有师兄师姐在招人的吗?我要求不高:

  • 能养活自己
  • 有电脑用
  • 最好不用加班(做梦)

(附上我的专业技能:会Google、会复制粘贴、会重启电脑)

SQL示例

创建数据库

配置数据库连接

自动下载maven依赖

启动项目

启动成功

访问及测试

默认页面接口定义

在浏览器中访问

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

示例下载

下载完整示例

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

HunyuanOCR限流策略说明:防止API滥用保障服务质量

HunyuanOCR限流策略设计与工程实践 在当前AI服务快速普及的背景下&#xff0c;一个高性能OCR系统不仅要“看得清”&#xff0c;更要“扛得住”。腾讯混元团队推出的HunyuanOCR作为一款基于多模态大模型架构的轻量级专家模型&#xff0c;在仅1B参数规模下实现了多项SOTA性能。然…

作者头像 李华
网站建设 2026/8/17 23:35:14

游戏本地化加速:HunyuanOCR提取UI界面文字供翻译团队使用

游戏本地化加速&#xff1a;HunyuanOCR提取UI界面文字供翻译团队使用 在一款新上线的国产MMORPG准备出海时&#xff0c;本地化团队常常面临这样的困境&#xff1a;几十个UI界面、上千条文本散落在各种弹窗、按钮和提示框中&#xff0c;全部嵌入在高分辨率截图里。过去的做法是…

作者头像 李华
网站建设 2026/8/7 18:12:35

HunyuanOCR伦理声明:禁止用于监控、人脸追踪等侵犯隐私场景

HunyuanOCR&#xff1a;轻量端到端多模态OCR的技术突破与伦理边界 在智能办公、跨境交流和数字文档管理日益普及的今天&#xff0c;如何快速准确地从图像中提取结构化信息&#xff0c;已成为许多行业亟待解决的核心问题。传统OCR系统往往依赖复杂的多阶段流水线——先检测文字区…

作者头像 李华
网站建设 2026/8/16 4:33:31

HunyuanOCR商业授权模式说明:个人免费 vs 企业收费政策解读

HunyuanOCR商业授权模式说明&#xff1a;个人免费 vs 企业收费政策解读 在今天这个文档数字化进程不断加速的时代&#xff0c;从一张发票的自动报销&#xff0c;到一份合同的关键信息提取&#xff0c;再到视频中字幕的实时识别——背后都离不开光学字符识别&#xff08;OCR&am…

作者头像 李华
网站建设 2026/8/16 10:06:54

HunyuanOCR能否识别篆书与隶书?古代汉字识别能力初步验证

HunyuanOCR能否识别篆书与隶书&#xff1f;古代汉字识别能力初步验证 在数字化浪潮席卷文化遗产保护的今天&#xff0c;古籍扫描、碑帖存档、文物铭文提取等任务对OCR技术提出了前所未有的挑战。我们早已习惯手机拍照一键转文字的流畅体验&#xff0c;但当图像中的文字不再是宋…

作者头像 李华
网站建设 2026/8/16 10:42:50

HunyuanOCR私有化部署成本分析:自建vs租用云服务经济性对比

HunyuanOCR私有化部署成本分析&#xff1a;自建 vs 租用云服务经济性对比 在银行每天处理数万张票据、医院需要快速提取病历信息、跨国企业频繁进行多语言文档翻译的今天&#xff0c;OCR已不再是“锦上添花”的辅助工具&#xff0c;而是支撑业务运转的关键基础设施。然而&…

作者头像 李华