news 2026/4/10 8:57:04

使用javascript处理大附件上传有哪些解决方案总结?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用javascript处理大附件上传有哪些解决方案总结?

我,某IT企业技术总监,聊聊这套“高可靠、强兼容”大文件传输解决方案的落地实践

作为服务过300+政企客户的技术负责人,我太清楚大文件传输场景的“坑”了——从100G文件的断点续传稳定性,到IE8兼容的技术攻坚;从文件夹层级的精准保留,到加密存储的合规要求,每一个环节都可能成为项目的“绊脚石”。最近为集团客户开发的“非打包大文件传输系统”,我们踩过开源组件的坑、调过加密算法的兼容性、甚至为IE8重写了上传逻辑。现在,我把这套“买断无忧、即插即用”的解决方案掏出来,帮你避开所有坑。


一、需求拆解:政企客户的核心诉求清单

先明确客户的“刚需”,咱们一条条对标:

需求维度关键点政企项目痛点
大文件传输单文件100G+上传/下载,支持文件夹(保留层级)开源组件(如WebUploader)停更,不支持IE8/文件夹;非打包下载避免服务器崩溃
断点续传刷新/关闭浏览器后进度不丢失(高稳定性)客户业务中断成本高(如政府文件传输中断影响审批流程)
加密合规传输(HTTPS)+存储(SM4/AES可配置)加密,下载自动解密政府项目对数据安全要求严格,需符合国密标准
兼容性操作系统(Win/macOS/Linux/国产系统)、浏览器(IE8+)、框架(Vue2/Vue3/React/JSP/SpringBoot)客户老旧设备(Win7+IE8)必须可用;多技术栈项目需无缝集成
成本与效率一次性买断(98万内)、不限项目数、5家以上政企合作案例年400万授权费压力大;商务流程繁琐影响项目交付效率

二、技术方案:分层架构,解决“不可能三角”

采用“前端分片上传+服务端进度追踪+加密存储引擎+跨平台适配”四层架构,确保大文件传输的“大容量、稳续传、强安全、广兼容”。

架构图(简化版):

[前端(Vue2/Vue3/React)] → [分片上传组件] → [服务端(JSP/SpringBoot)] → [加密存储引擎(SM4/AES)] → [阿里云OSS(私有云)] │ ↓ └─────────────────── [现有业务系统(Windows/Linux/国产系统)] ────────────────┘
  • 前端分片上传:基于File API+Blob.slice实现分片(每片5MB),兼容IE8(使用XMLHttpRequest.sendAsBinary);通过localStorage+服务端双重记录进度,解决刷新/关浏览器丢失问题。
  • 服务端进度追踪:使用Redis存储分片上传状态(支持分布式),关联用户ID+文件哈希值,确保进度可追溯;文件夹层级通过递归解析目录结构保存为JSON元数据。
  • 加密存储引擎:传输层强制HTTPS,存储层支持SM4(国密)/AES(国际)算法切换,下载时自动解密(密钥动态生成,内存不落地)。
  • 跨平台适配:后端用OpenJDK 8编译(支持x86/arm/龙芯),前端通过Babel转译ES5(兼容IE8),依赖库均为跨平台(如crypto-js支持国密扩展)。

三、前端关键代码:Vue2分片上传组件(兼容IE8+)

1. 分片上传核心逻辑(支持断点续传)
// Vue2组件:BigFileUpload.vue(兼容IE8)// 兼容IE8的工具函数(ES5语法)varutils={// 生成唯一文件标识(MD5,兼容IE8需引入crypto-js)getFileHash:function(file,callback){varreader=newFileReader();reader.onload=function(e){varwordArray=CryptoJS.lib.WordArray.create(e.target.result);callback(CryptoJS.MD5(wordArray).toString());};reader.readAsArrayBuffer(file);// IE8用readAsBinaryString需特殊处理},// 分片上传(兼容IE8的XMLHttpRequest)uploadChunk:function(url,chunk,fileName,chunkIndex,totalChunks,fileHash,callback){varxhr=newXMLHttpRequest();xhr.open('POST',url,true);xhr.setRequestHeader('Content-Type','application/octet-stream');xhr.setRequestHeader('X-File-Hash',fileHash);xhr.setRequestHeader('X-Chunk-Index',chunkIndex);xhr.setRequestHeader('X-Total-Chunks',totalChunks);xhr.setRequestHeader('X-File-Name',encodeURIComponent(fileName));xhr.onreadystatechange=function(){if(xhr.readyState===4&&xhr.status===200){callback(JSON.parse(xhr.responseText));}};xhr.send(chunk);}};exportdefault{data:function(){return{file:null,progress:0,fileHash:'',chunkSize:5*1024*1024,// 5MB分片uploadedChunks:[]// 已上传分片索引};},methods:{handleFileSelect:function(e){this.file=e.target.files[0];if(!this.file)return;// 计算文件哈希(用于断点续传标识)utils.getFileHash(this.file,(hash)=>{this.fileHash=hash;// 查询服务端已上传分片(兼容刷新/关浏览器)this.$http.get('/api/upload/check?fileHash='+hash).then((res)=>{if(res.data.code===200){this.uploadedChunks=res.data.uploadedChunks;this.progress=(this.uploadedChunks.length/this.getTotalChunks())*100;}});});},}};
2. 文件夹上传(保留层级结构)
// 扩展方法:递归上传文件夹(兼容IE8)BigFileUpload.prototype.uploadFolder=function(folderPath){varself=this;// 读取文件夹(需浏览器支持webkitdirectory,IE不支持,需引导用户使用现代浏览器)varinput=document.createElement('input');input.type='file';input.webkitdirectory=true;input.onchange=function(e){varfiles=e.target.files;varfolderStructure={};// 保存层级结构 { "父目录": ["子文件1", "子目录/子文件2"] }// 遍历文件,解析相对路径for(vari=0;i<files.length;i++){varfile=files[i];varrelativePath=file.webkitRelativePath.replace(folderPath+'/','');// 去除根路径vardirs=relativePath.split('/');varfileName=dirs.pop();varcurrentDir=folderStructure;// 构建目录树dirs.forEach(function(dir){if(!currentDir[dir])currentDir[dir]={};currentDir=currentDir[dir];});currentDir[fileName]=file;// 标记文件}// 递归上传目录结构self.uploadDirectoryRecursive(folderStructure,'',folderPath);};input.click();};

四、后端关键代码:SpringBoot实现分片合并+加密存储

1. 分片上传与合并接口(兼容JSP)
// 分片上传控制器:UploadController.java(兼容JSP/SpringBoot)@RestController@RequestMapping("/api/upload")publicclassUploadController{@AutowiredprivateRedisTemplateredisTemplate;// 存储分片进度@AutowiredprivateFileStorageServicefileStorageService;// 加密存储服务// 检查已上传分片(兼容刷新/关浏览器)@GetMapping("/check")publicMapcheckUploadProgress(@RequestParamStringfileHash){Mapresult=newHashMap<>();Stringkey="upload:progress:"+fileHash;StringuploadedChunks=redisTemplate.opsForValue().get(key);result.put("code",200);result.put("uploadedChunks",uploadedChunks!=null?Arrays.asList(uploadedChunks.split(",")):newArrayList<>());returnresult;}}
2. 加密存储服务(SM4/AES可配置)
// 加密存储服务:FileStorageService.java@ServicepublicclassFileStorageService{@Value("${encrypt.algorithm:SM4}")// 可配置SM4/AESprivateStringalgorithm;@Value("${encrypt.key}")// 密钥从配置中心获取(支持动态刷新)privateStringkey;// 加密并存储文件(阿里云OSS私有云)publicvoidencryptAndSave(Filefile,Stringkey)throwsException{// 读取文件内容byte[]fileData=Files.readAllBytes(file.toPath());// 加密(SM4示例,AES类似)byte[]encryptedData;if("SM4".equalsIgnoreCase(algorithm)){encryptedData=SM4.encrypt(fileData,key.getBytes());}else{encryptedData=AES.encrypt(fileData,key.getBytes());}// 上传至阿里云OSS(私有云)OSSClientossClient=newOSSClientBuilder().build(configService.getOssEndpoint(),configService.getOssAccessKeyId(),configService.getOssAccessKeySecret());ossClient.putObject(configService.getOssBucketName(),"encrypted/"+file.getName(),newByteArrayInputStream(encryptedData));ossClient.shutdown();}// 下载时自动解密(返回解密后的文件流)publicInputStreamdownloadAndDecrypt(StringfileName)throwsException{// 从OSS获取加密文件流OSSClientossClient=newOSSClientBuilder().build(configService.getOssEndpoint(),configService.getOssAccessKeyId(),configService.getOssAccessKeySecret());OSSObjectossObject=ossClient.getObject(configService.getOssBucketName(),"encrypted/"+fileName);InputStreamencryptedStream=ossObject.getObjectContent();// 解密(SM4/AES可配置)InputStreamdecryptedStream;if("SM4".equalsIgnoreCase(algorithm)){decryptedStream=newSM4DecryptInputStream(encryptedStream,key.getBytes());}else{decryptedStream=newAESDecryptInputStream(encryptedStream,key.getBytes());}ossClient.shutdown();returndecryptedStream;}}

五、信创兼容与稳定性保障

1. 信创环境适配
  • 操作系统:后端使用OpenJDK 8(支持x86/arm/龙芯/鲲鹏),前端通过Babel转译ES5,依赖库均为跨平台(如crypto-js支持国密扩展)。
  • 数据库:MySQL通过MyBatis兼容Oracle/SQL Server(使用databaseIdProvider动态切换方言),Redis支持国产缓存(如华为分布式缓存服务)。
  • CPU架构:测试覆盖x86(Intel/AMD/兆芯/海光)、ARM(鲲鹏/飞腾)、龙芯(MIPS/LoongArch),确保二进制兼容。
2. 浏览器兼容性
  • IE8:使用XMLHttpRequest.sendAsBinary上传分片,FileReader读取文件(降级为readAsBinaryString),避免ES6语法(通过es5-shim补全)。
  • 现代浏览器:支持Chrome/Firefox/360安全浏览器,使用Blob.slice分片,fetch上传(降级为XMLHttpRequest)。
3. 稳定性保障
  • 断点续传:服务端用Redis存储分片进度(支持分布式),客户端上传前校验已传分片,避免重复传输。
  • 大文件处理:采用流式上传/下载(非内存驻留),分片大小5MB(平衡网络与稳定性),OSS支持分片上传(10G+文件无压力)。
  • 监控告警:集成Prometheus+Grafana监控上传成功率、加密耗时,异常时触发企业微信告警(如分片超时、加密失败)。

六、合作与成本:98万买断的“性价比”

1. 厂商资质与合作案例

我们团队来自某头部企业级软件厂商(已服务200+政企客户),提供以下资质证明(可线下核对):

  • 央企/国企合作案例:某省级政务云文件共享平台(100G+公文传输)、某国有银行信贷档案管理系统(非打包下载),附合同关键页(脱敏)、软件著作权证书(软著2023SRXXXXXX)、信创环境认证书(麒麟OS/Vmware适配)。
  • 银行转账凭证:某客户2024年采购合同(金额280万)的付款回单(脱敏)。
  • 营业执照/法人身份证:公司全称“福建XX科技有限公司”,法人王XX(身份证号脱敏)。
2. 买断授权方案
  • 费用:98万(一次性支付),包含:
    • 永久授权(不限项目数、不限用户数);
    • 5年免费升级(含功能迭代、安全补丁);
    • 专属技术支持(7×24小时电话/在线,重大问题2小时响应)。
  • 交付物
    • 完整源代码(前端分片上传组件、后端Spring Boot版);
    • 部署文档(含Tomcat/JSP集成、OSS私有云配置、MySQL/Oracle迁移指南);
    • 培训服务(2天现场培训,覆盖开发/运维团队)。

写在最后:这事儿,我们帮你搞定

从需求分析到代码落地,从兼容性调试到加密合规,我们已经踩过所有坑,整理好了一套“开箱即用”的解决方案。如果你需要:

  • 现成的前端分片上传组件(含IE8适配、文件夹上传、断点续传);
  • 与现有JSP/SpringBoot系统集成的详细步骤(Vue2/Vue3/React兼容);
  • 央企国企合作案例的原始合同/证书;

欢迎随时联系我(微信:XXX,电话:XXX)。群里(QQ群:374992201)有我们的技术顾问,24小时答疑——毕竟,政企项目,稳定的支持比“便宜的价格”更重要

(最后说句实在话:98万买断,相当于每个项目分摊4900元(按200个项目算),比每年400万授权费省了302万!这钱,花得值!)

导入项目

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

工程

NOSQL

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

创建数据表

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

修改数据库连接信息

访问页面进行测试

文件存储路径

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

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载

下载续传

文件下载支持离线保存进度信息,刷新页面,关闭页面,重启系统均不会丢失进度信息。

文件夹下载

支持下载文件夹,并保留层级结构,不打包,不占用服务器资源。

下载示例

点击下载完整示例

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

nodejs+vue线上视频学习系统设计与实现

文章目录 系统架构设计核心功能模块技术实现要点部署与扩展 --nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统架构设计 采用前后端分离架构&#xff0c;Node.js&#xff08;Express/Koa框架&#xff09;提供RE…

作者头像 李华
网站建设 2026/4/8 17:11:03

2026年电商设计趋势:AI一键生成多套电商主图,还能同步风格

新年好呀&#xff01;又到了一年一度囤年货的时节&#xff0c;这也是咱们电商伙伴们推广商品的黄金档期。想要快速制作一批吸引人的电商海报&#xff1f;不同平台、不同尺寸该如何高效搞定&#xff1f; 别担心&#xff0c;用“秒出设计”就能轻松解决。它接入了最新的 nano ban…

作者头像 李华
网站建设 2026/4/3 4:15:42

别再只做能耗统计了:零碳园区需要的是“碳排闭环”

安科瑞刘鸿鹏摘要 在“双碳”战略背景下&#xff0c;零碳园区已成为推动工业绿色转型与区域能源结构优化的重要抓手。四川人民政府网发布的五部门联合印发《关于开展零碳工厂建设工作的指导意见》&#xff0c;进一步明确了零碳工厂/园区建设从“示范试点”走向“标准化推广”的…

作者头像 李华
网站建设 2026/4/8 15:43:20

基于优化储能控制技术的无缝切换不间断交流电源系统设计

基于优化储能控制技术的无缝切换不间断交流电源系统设计 第一章 绪论 传统不间断电源&#xff08;UPS&#xff09;多采用机械切换或简单储能放电模式&#xff0c;存在电网失电时切换中断&#xff08;通常2-10ms&#xff09;、储能电池充放电效率低、深度放电易衰减等问题&…

作者头像 李华
网站建设 2026/4/4 16:58:36

必收藏|人工智能体入门详解(小白/程序员必看):不是聊天机器人,是未来超级助手

人工智能体是一类具备主动感知环境、拆解复杂任务、自主调用工具&#xff0c;最终达成预设目标的自主智能系统&#xff0c;和我们日常接触的传统聊天机器人有着本质区别&#xff0c;并非“更聪明的对话工具”。其核心技术涵盖任务解析规划、工具调用引擎、记忆存储系统及反馈优…

作者头像 李华
网站建设 2026/3/21 13:30:16

Jenkins节点编码环境深度解析:从配置到Java Web连接原理

引言 在全球化软件开发中&#xff0c;正确的编码环境配置是确保构建过程稳定性的关键因素。Jenkins作为主流的CI/CD工具&#xff0c;常常需要管理分布在不同地区、使用不同语言的构建节点。本文将深入探讨如何为Jenkins节点配置编码环境&#xff0c;并重点解析Java Web连接方式…

作者头像 李华