news 2026/5/1 3:49:17

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/4/30 10:00:08

HunyuanOCR与Elasticsearch集成:实现海量扫描文档全文检索

HunyuanOCR与Elasticsearch集成&#xff1a;实现海量扫描文档全文检索 在金融、政务或医疗行业的日常工作中&#xff0c;你是否曾为查找一份三年前签署的合同而翻遍档案柜&#xff1f;又或者面对成千上万张多语种发票时&#xff0c;不得不依赖人工逐张录入信息&#xff1f;这些…

作者头像 李华
网站建设 2026/5/1 3:49:17

图像预处理最佳实践:裁剪、去噪、增强对比度提升HunyuanOCR效果

图像预处理最佳实践&#xff1a;裁剪、去噪、增强对比度提升HunyuanOCR效果 在移动端拍照翻译、卡证识别或视频字幕提取这些日常高频场景中&#xff0c;你是否遇到过这样的问题&#xff1f;一张倾斜的发票照片&#xff0c;OCR模型却把金额识别成了“&#xffe5;8O0.00”&#…

作者头像 李华
网站建设 2026/5/1 3:46:25

Linux服务器部署HunyuanOCR生产环境:权限管理与防火墙配置要点

Linux服务器部署HunyuanOCR生产环境&#xff1a;权限管理与防火墙配置要点 在企业级AI服务日益普及的今天&#xff0c;一个“能用”的模型远远不够——真正决定其能否投入生产的&#xff0c;是背后那套看不见的系统工程能力。以腾讯混元OCR&#xff08;HunyuanOCR&#xff09;为…

作者头像 李华
网站建设 2026/4/24 23:33:38

关于Typora代码块痛点破解方案

Typora代码块痛点破解方案技术文章大纲痛点分析&#xff1a;Typora代码块的常见问题代码块语法高亮支持有限&#xff0c;部分语言无法正确识别大型代码块渲染速度慢&#xff0c;影响编辑流畅性跨平台显示不一致&#xff0c;特别是Windows/macOS/Linux之间导出PDF/HTML时格式丢失…

作者头像 李华
网站建设 2026/4/18 2:23:37

按需计费Token方案上线:调用HunyuanOCR API按实际用量付费

按需计费Token方案上线&#xff1a;调用HunyuanOCR API按实际用量付费 在智能文档处理需求激增的今天&#xff0c;企业对OCR技术的依赖早已超越“能不能识别文字”的基础阶段&#xff0c;转而关注“识别得准不准、快不快、贵不贵”。尤其是电商、金融、跨境物流等行业&#xff…

作者头像 李华
网站建设 2026/4/29 8:14:29

HunyuanOCR是否开源训练代码?目前仅开放推理部分代码说明

HunyuanOCR是否开源训练代码&#xff1f;目前仅开放推理部分代码说明 在智能文档处理需求日益增长的今天&#xff0c;企业对高效、精准且易于部署的OCR解决方案提出了更高要求。传统的OCR系统往往依赖复杂的多阶段流水线&#xff1a;先检测文字区域&#xff0c;再逐个识别内容&…

作者头像 李华