news 2026/6/10 21:01:56

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/6/10 16:05:43

HunyuanOCR识别菜单价格:餐厅数字化管理系统集成案例

HunyuanOCR识别菜单价格&#xff1a;餐厅数字化管理系统集成案例 在一家连锁餐厅的后厨&#xff0c;服务员刚拿到一份新设计的艺术风格纸质菜单——手写字体、金色描边、图文穿插。过去&#xff0c;将这份菜单录入系统需要两名员工花上近20分钟逐条输入&#xff0c;还常因“38元…

作者头像 李华
网站建设 2026/6/10 15:36:01

论文精读|插件无政府状态

论文&#xff1a;Anarchy in the Database: A Survey and Evaluation of Database Management System Extensibility github&#xff1a;https://github.com/cmu-db/ext-analyzer pgconf&#xff1a;The trouble with extensions (PGConf.dev 2025) why this paper 这是一篇数…

作者头像 李华
网站建设 2026/6/10 5:47:12

经纬度小数位数的实际影响

在地理信息系统&#xff08;GIS&#xff09;、测绘及互联网位置服务中&#xff0c;经纬度坐标的表示精度是一个核心技术参数。经纬度的小数位数不仅决定了坐标的“理论分辨率”&#xff0c;还直接影响到数据存储效率、空间拓扑一致性以及最终的应用场景适配。 一、 经纬度精度…

作者头像 李华
网站建设 2026/6/10 2:23:21

元宇宙场景融合:HunyuanOCR解析虚拟世界中的文字元素

元宇宙场景融合&#xff1a;HunyuanOCR解析虚拟世界中的文字元素 在一场全球用户同屏互动的虚拟演唱会中&#xff0c;舞台背景不断切换着多语言滚动字幕、艺人名签和实时弹幕&#xff1b;而在另一端&#xff0c;AI导览助手正自动识别展厅内的展品说明&#xff0c;并将其翻译成…

作者头像 李华
网站建设 2026/6/9 22:40:52

专利文献处理难题破解:HunyuanOCR识别复杂排版技术文档

专利文献处理难题破解&#xff1a;HunyuanOCR识别复杂排版技术文档 在知识产权竞争日益激烈的今天&#xff0c;全球每年新增数百万件专利申请&#xff0c;大量技术细节深藏于扫描图像、PDF文件和跨语言文档中。对于企业研发、专利审查员或科技情报分析师而言&#xff0c;如何快…

作者头像 李华
网站建设 2026/6/10 20:22:33

贡献者指南:如何参与HunyuanOCR社区建设与问题反馈

贡献者指南&#xff1a;如何参与HunyuanOCR社区建设与问题反馈 在智能文档处理需求爆发的今天&#xff0c;企业对OCR技术的要求早已不再局限于“把图上的字读出来”。真实场景中&#xff0c;我们面对的是倾斜扫描件、多语言混排合同、模糊发票、带水印证件——传统OCR系统往往在…

作者头像 李华