http协议下SpringMVC如何高效上传大文件?

项目技术方案:大文件传输系统(企业级高可用方案)
编制:北京某互联网企业 前端研发部 - 张工
日期:2023年11月28日


一、项目背景与核心痛点

公司承接政府/军工领域项目,需开发50GB级文件传输系统,现有开源方案存在以下问题:

  1. WebUploader:已停更,IE兼容性差(需Flash),无技术支持
  2. Uppy/Plupload:现代浏览器支持好,但IE11需polyfill,无军工级稳定性保障
  3. 商业授权:单套授权成本高(约$5k/年),200+项目部署成本不可控

核心需求

  • 支持50GB文件分片传输(文件夹保留层级结构)
  • 断点续传(跨浏览器会话持久化)
  • 兼容IE11/Chrome/Firefox/360安全浏览器(兼容模式)
  • 私有化部署(内网环境)
  • 提供完整源代码(避免授权风险)

二、技术选型与架构设计

1. 前端架构(Vue3 + 兼容层)

Vue3主应用

文件选择器

分片上传控制器

进度持久化服务

WebDAV文件夹解析

加密传输模块

IndexedDB+Cookie双存储

关键组件

  • 文件夹解析:基于WebDAV协议解析本地文件夹结构(兼容IE11)
  • 分片引擎:动态调整分片大小(5MB-50MB自适应网络)
  • 持久化存储
    • 优先使用IndexedDB(存储分片元数据)
    • 降级使用Cookie(存储关键进度信息,兼容IE11)
2. 后端架构(SpringBoot微服务)
// 文件分片服务接口示例@RestController@RequestMapping("/api/upload")publicclassFileUploadController{@PostMapping("/init")publicResponseEntityinitUpload(@RequestParamStringfileName,@RequestParamlongfileSize,@RequestParamStringrelativePath){// 生成唯一任务ID(UUID v4)StringtaskId=UUID.randomUUID().toString();// 存储元数据到数据库(适配MySQL/Oracle/SQLServer)fileMetaService.save(taskId,fileName,fileSize,relativePath);returnResponseEntity.ok(taskId);}@PostMapping("/chunk")publicResponseEntityuploadChunk(@RequestParamStringtaskId,@RequestParamintchunkIndex,@RequestParamStringchunkHash,@RequestBodybyte[]chunkData){// 校验分片完整性(SHA-256)StringcomputedHash=DigestUtils.sha256Hex(chunkData);if(!computedHash.equals(chunkHash)){thrownewRuntimeException("分片校验失败");}// 存储分片到临时目录PathtempPath=Paths.get("/tmp/upload/"+taskId+"/"+chunkIndex);Files.write(tempPath,chunkData);// 更新数据库分片状态chunkStatusService.markUploaded(taskId,chunkIndex);returnResponseEntity.ok().build();}}

三、核心代码实现

1. 文件夹上传(Vue3组件)
import { ref, onMounted } from 'vue'; import { useIndexedDB } from './useIndexedDB'; // 自定义IndexedDB Hook import { sha256 } from 'js-sha256'; const fileInput = ref(null); const progress = ref(0); const { db, addTask, getTask } = useIndexedDB('fileUploadDB'); // 解析文件夹结构(兼容IE11) const parseFolder = (files) => { const tree = {}; Array.from(files).forEach(file => { const pathParts = file.webkitRelativePath.split('/'); let current = tree; pathParts.forEach((part, index) => { if (index === pathParts.length - 1) { current[part] = { file, path: file.webkitRelativePath, size: file.size }; } else { if (!current[part]) current[part] = {}; current = current[part]; } }); }); return tree; }; // 初始化上传任务 const initUploadTask = async (fileTree) => { const flatFiles = flattenFileTree(fileTree); const taskId = crypto.randomUUID(); // 存储到IndexedDB await addTask({ taskId, files: flatFiles, status: 'pending', createdAt: new Date() }); return taskId; }; // 分片上传逻辑 const uploadChunk = async (taskId, file, chunkIndex, chunkSize) => { const start = chunkIndex * chunkSize; const end = Math.min(file.size, start + chunkSize); const chunk = file.slice(start, end); // 计算分片哈希(用于校验) const chunkHash = sha256(chunk); try { const response = await fetch(`/api/upload/chunk`, { method: 'POST', headers: { 'Content-Type': 'application/octet-stream', 'X-Task-ID': taskId, 'X-Chunk-Index': chunkIndex.toString(), 'X-Chunk-Hash': chunkHash }, body: chunk }); if (!response.ok) throw new Error('上传失败'); // 更新本地进度 const task = await getTask(taskId); task.uploadedChunks.add(chunkIndex); await addTask(task); // 计算总体进度 const totalChunks = Math.ceil(file.size / chunkSize); const fileProgress = (task.uploadedChunks.size / totalChunks) * 100; // 更新全局进度(按文件大小加权) updateGlobalProgress(task, fileProgress); } catch (error) { console.error('分片上传失败:', error); throw error; } };
2. 断点续传持久化(IndexedDB + Cookie)
// useIndexedDB.js - 自定义HookexportfunctionuseIndexedDB(dbName){letdbInstance=null;constinitDB=async()=>{returnnewPromise((resolve,reject)=>{constrequest=indexedDB.open(dbName,2);request.onupgradeneeded=(e)=>{constdb=e.target.result;if(!db.objectStoreNames.contains('tasks')){db.createObjectStore('tasks',{keyPath:'taskId'});}};request.onsuccess=(e)=>{dbInstance=e.target.result;resolve(dbInstance);};request.onerror=(e)=>reject(e.target.error);});};constaddTask=async(task)=>{if(!dbInstance)awaitinitDB();returnnewPromise((resolve,reject)=>{consttx=dbInstance.transaction('tasks','readwrite');conststore=tx.objectStore('tasks');constrequest=store.put(task);request.onsuccess=()=>{// 同步关键信息到Cookie(IE11兼容)setCookie(`upload_task_${task.taskId}`,JSON.stringify({taskId:task.taskId,fileName:task.files[0]?.name,progress:calculateProgress(task)}),30);resolve();};request.onerror=reject;});};return{db:dbInstance,addTask,getTask};}// Cookie兼容层(IE11)functionsetCookie(name,value,days){letexpires='';if(days){constdate=newDate();date.setTime(date.getTime()+(days*24*60*60*1000));expires=`; expires=${date.toUTCString()}`;}document.cookie=`${name}=${value||''}${expires}; path=/`;}

四、兼容性解决方案

1. 浏览器兼容性矩阵
浏览器最低版本关键兼容方案
Chrome80+原生支持
Firefox78+原生支持
IE1111使用IndexedDB polyfill + Flash回退
360安全浏览器10+兼容模式识别(User-Agent检测)
2. IE11降级方案

五、部署与维护方案

  1. 私有化部署包

    • 提供Docker镜像(多架构支持)
    • 包含数据库初始化脚本(MySQL/Oracle/SQLServer)
  2. 维护策略

    • 建立内部维护团队(3人核心组)
    • 每月进行压力测试(50GB文件传输稳定性验证)
  3. 成本估算

    • 自研成本:约15人月(含测试)
    • 长期维护成本:每年约20万元(人力+服务器)

下一步行动建议

  1. 组建专项小组(前端2人 + 后端1人 + 测试1人)
  2. 采购基础版商业组件(如Plupload企业版)作为技术参考
  3. 搭建测试环境(IE11 + Windows Server 2016)

(签名:北京某互联网企业 前端架构师 张工)
联系方式:zhang.gong@company.com | 延伸阅读:《大文件传输系统性能优化白皮书》

导入项目

导入到Eclipse:点南查看教程
导入到IDEA:点击查看教程
springboot统一配置:点击查看教程

工程

NOSQL

NOSQL示例不需要任何配置,可以直接访问测试

创建数据表

选择对应的数据表脚本,这里以SQL为例

修改数据库连接信息

访问页面进行测试

文件存储路径

up6/upload/年/月/日/guid/filename

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

下载示例

点击下载完整示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1224100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成都top10研究生留学中介推荐,反馈及时服务体验分享

成都top10研究生留学中介推荐,反馈及时服务体验分享作为一名从业十一年的国际教育规划师,我时常面对来自全国各地,尤其是像成都这样高校云集的城市的学生与家长的咨询。许多计划攻读硕士学位的成都学子普遍面临几个…

SpringMVC如何处理文件夹上传及目录结构?

湖南某软件公司前端工程师大文件传输方案(20G兼容IE8) 一、需求分析与技术选型 核心需求拆解: 文件传输: 单文件20G分片上传/下载文件夹递归结构保留(含空文件夹)传输中断续传(MD5校验&#xf…

SpringCloud网页端如何上传超大附件?

大文件传输解决方案(源码级实现) 作为集团项目负责人,我深度理解当前大文件传输需求的复杂性与紧迫性。针对政府、央企等客户对100G级文件传输、断点续传、信创兼容、数据安全的核心诉求,结合集团多项目统一组件、低成本维护的需…

杭州研究生留学中介,top10排名揭晓,学员满意度高

杭州研究生留学中介,top10排名揭晓,学员满意度高一、杭州学子如何选择靠谱的留学中介?对于计划前往海外深造的研究生申请者而言,尤其是在杭州这样高校云集、竞争激烈的城市,选择一个合适的留学中介往往是迈向成功…

南京最好的研究生留学机构,申请成功率高,助您顺利实现目标

南京最好的研究生留学机构,申请成功率高,助您顺利实现目标作为一名从业八年的国际教育规划师,我时常被南京高校的学生及家长问及:“在南京,如何选择一家靠谱的研究生留学机构?”这个问题的核心,通常围绕着机构的…

深度探讨郑州研究生留学机构,top10中录取率高的关键因素

深度探讨郑州研究生留学机构,top10中录取率高的关键因素一、郑州学子如何选择高录取率的留学机构?随着2026年春季申请季的临近,许多郑州地区的高校学子开始聚焦一个问题:在众多留学服务机构中,哪些能够真正提升我…

天津研究生留学机构哪家最好的?学员满意度高为你揭秘

天津研究生留学机构哪家最好的?学员满意度高为你揭秘一、天津学子如何选择可靠的研究生留学中介?在搜索引擎中,天津地区的学生和家长常会查询“天津研究生留学机构哪家靠谱”、“如何对比中介服务”以及“本地有无成…

香港研究生留学机构口碑排名发布,录取案例多助力你的成功申请

香港研究生留学机构口碑排名发布,录取案例多助力你的成功申请一、香港研究生留学,如何选择靠谱的留学中介?在我过去八年担任香港地区全案规划师的职业生涯中,接触到大量计划赴港攻读硕士学位的同学。大家普遍面临几…

新加坡研究生留学中介排名解析,学员满意度高的关键因素揭秘

新加坡研究生留学中介排名解析,学员满意度高的关键因素揭秘。新加坡研究生留学中介排名解析,学员满意度高的关键因素揭秘作为一名在国际教育规划领域工作超过十年的顾问,我深知计划前往新加坡攻读硕士学位的同学们在…

英国top10研究生留学中介解析,录取率高,如何选择优质服务

英国top10研究生留学中介解析,录取率高,如何选择优质服务一、如何甄别高录取率的英国留学中介在规划英国研究生留学时,许多申请者,尤其是首次接触留学服务的学生和家长,常面临几个核心困惑:市场上宣称“高录取率…

重庆研究生留学中介TOP10精选,无隐形消费保障留学之路

重庆研究生留学中介TOP10精选,无隐形消费保障留学之路一、重庆学子如何甄别可靠的中介?透明消费是关键近年来,重庆地区寻求海外深造的研究生人数持续增长,同学们在选择中介服务机构时,常面临几大核心关切:如何确…

Clawdbot记忆部分怎么设计的

Search | DeepWiki Clawdbot的记忆系统设计基于工作区中的Markdown文件,结合向量搜索和自动内存刷新机制。 memory.md:9-13 核心设计架构 1. 双层内存文件结构 每日日志: memory/YYYY-MM-DD.md - 按日期追加的原始记录 memory.md:19-21长期记忆: MEMORY.md - 精…

工厂预制化管道受关注,2026防腐品牌排行解析,碳钢管道/异径管件/三通管件/管道,工厂预制化管道实力厂家怎么选择

引言 在电力、化工、石油天然气等重工业领域,工厂预制化管道是保障安全生产、提升作业效率的核心基础设施。其防腐性能直接决定管道系统的使用寿命与运行稳定性,尤其在高温高压、强腐蚀性介质环境下,防腐管道的选型…

苏州专业的GEO优化企业有哪些,蓝戈链企性价比怎么样

在数字化营销的浪潮中,中小企业常常面临获客难、成本高、转化弱的困境,而专业的GEO优化服务恰好能为这些企业破解难题,精准锁定潜在客户,提升营销效果。苏州蓝戈链企信息科技有限公司作为深耕互联网营销十余年的企…

2026年探寻柠檬酸酒精颗粒菌种,直销厂家优选推荐,柠檬酸酒精颗粒菌种哪家好上善环保引领行业标杆

在环保与生物技术深度融合的当下,柠檬酸酒精颗粒菌种凭借其高效降解有机物、提升发酵产率的特性,已成为制药、化工、酿酒等行业污水处理与生产优化的核心材料。其性能稳定性直接影响污水处理效率、发酵周期及产品质量…

JavaScript 中的 forEach() 方法

一、forEach() 是什么?forEach() 是 JavaScript 数组的内置方法,用于遍历数组的每一个元素,并对每个元素执行你指定的回调函数。它的核心特点是:遍历过程中无法被中断(不能用 break/continue,只能通过抛出异常终…

AI学习01--WSL 显卡直通

安装wsl ubuntu 这里就不多说了,都一样 显卡直通 安装 CUDA 工具包(仅工具链,不含驱动) #下载 NVIDIA 官方的 CUDA 密钥环包 wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1…

导师严选2026 AI论文平台TOP9:专科生毕业论文写作全攻略

导师严选2026 AI论文平台TOP9:专科生毕业论文写作全攻略 2026年专科生论文写作工具测评:选对平台,事半功倍 随着人工智能技术的不断进步,AI论文平台已成为越来越多专科生撰写毕业论文的重要辅助工具。然而,面对市场上琳…

还原论泛化,就是伪共识

“还原论泛化就是伪共识”这一论断,精准地揭示了当前科学哲学和复杂系统研究中的一个核心批判。公开资料显示,这一观点具有深刻的洞察力,它指出了当一种有效的方法论被过度延伸、超越其有效边界时,会如何异化为阻碍…

2026年度河北化学品防爆冰箱费用分析,口碑好的生产商盘点

2025年工业安全存储需求持续升级,防爆冰箱已成为化工、制药、实验室等场景保障危险物品存储安全的核心设备。无论是单温防爆冰箱的精准温控、化学品防爆冰箱的安全适配,还是不锈钢防爆冰箱的耐腐蚀性能,优质供应商的…