使用vue-cli构建网页时,文件上传下载有哪些推荐方案?

大文件传输系统设计方案(基于SM4国密算法)

需求分析

作为四川某软件公司的开发人员,我面临以下核心需求:

  1. 实现10GB级别大文件的分片上传/下载
  2. 采用国密SM4算法进行端到端加密
  3. 服务端需支持SM4加密存储
  4. 兼容主流浏览器及信创国产化环境
  5. 基于SpringBoot+Vue技术栈
  6. 需要开源可审查的代码

技术选型

经过调研,我决定采用以下技术方案:

前端方案

  • 基于Vue-cli构建
  • 使用自定义分片上传组件(替代已停更的WebUploader)
  • 集成SM4加密的JavaScript实现(通过wasm或纯JS实现)

后端方案

  • SpringBoot 2.7.x
  • 集成BouncyCastle的SM4实现
  • 支持分片合并和加密存储

前端核心代码实现

1. SM4加密工具类 (sm4-utils.js)

// 使用wasm版本的SM4实现(性能更好)letsm4Module=null;exportasyncfunctioninitSM4(){if(sm4Module)return;try{sm4Module=awaitimport('sm4-wasm');awaitsm4Module.default();// 初始化wasm模块}catch(e){console.error('SM4 WASM加载失败,降级使用JS实现',e);// 降级方案:使用纯JS实现awaitimport('./sm4-js').then(module=>{sm4Module=module;});}}exportfunctionencryptFileChunk(chunk,key,iv){if(!sm4Module)thrownewError('SM4未初始化');// 转换为ArrayBufferconstarrayBuffer=chunkinstanceofArrayBuffer?chunk:awaitnewResponse(chunk).arrayBuffer();// 使用SM4-CBC模式加密returnsm4Module.encrypt(arrayBuffer,key,iv,'CBC');}exportfunctiondecryptFileChunk(encryptedChunk,key,iv){if(!sm4Module)thrownewError('SM4未初始化');returnsm4Module.decrypt(encryptedChunk,key,iv,'CBC');}

2. 分片上传组件 (FileUploader.vue)

import{initSM4,encryptFileChunk}from'./sm4-utils';// 生成随机IVfunctiongenerateIV(){returncrypto.getRandomValues(newUint8Array(16));}exportdefault{data(){return{file:null,uploading:false,progress:0,chunkSize:5*1024*1024,// 5MB每片sm4Key:null,// 实际应从安全渠道获取fileId:null};},asyncmounted(){awaitinitSM4();// 生成随机密钥(实际项目应从安全渠道获取)this.sm4Key=crypto.getRandomValues(newUint8Array(16));},methods:{handleFileChange(e){this.file=e.target.files[0];this.progress=0;},asyncstartUpload(){if(!this.file)return;this.uploading=true;this.progress=0;try{// 1. 初始化上传,获取fileIdconstinitRes=awaitthis.$http.post('/api/upload/init',{fileName:this.file.name,fileSize:this.file.size,chunkSize:this.chunkSize});this.fileId=initRes.data.fileId;constiv=generateIV();// 2. 上传加密分片constchunkCount=Math.ceil(this.file.size/this.chunkSize);letuploadedChunks=0;for(leti=0;i<chunkCount;i++){conststart=i*this.chunkSize;constend=Math.min(start+this.chunkSize,this.file.size);constchunk=this.file.slice(start,end);// 加密分片constencryptedChunk=awaitencryptFileChunk(chunk,this.sm4Key,iv);// 上传分片constformData=newFormData();formData.append('fileId',this.fileId);formData.append('chunkIndex',i);formData.append('chunk',newBlob([encryptedChunk]));formData.append('iv',newBlob([iv]));// 每个分片使用相同IV(简单实现)awaitthis.$http.post('/api/upload/chunk',formData,{headers:{'Content-Type':'multipart/form-data'}});uploadedChunks++;this.progress=Math.floor((uploadedChunks/chunkCount)*100);}// 3. 完成上传awaitthis.$http.post('/api/upload/complete',{fileId:this.fileId,iv:Array.from(iv).join(',')// 实际应使用更安全的方式传输IV});this.$emit('upload-success',{fileId:this.fileId,fileName:this.file.name});}catch(error){console.error('上传失败:',error);this.$emit('upload-error',error);}finally{this.uploading=false;}}}};

后端核心代码实现

1. SM4工具类 (SM4Util.java)

importorg.bouncycastle.crypto.engines.SM4Engine;importorg.bouncycastle.crypto.modes.CBCBlockCipher;importorg.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;importorg.bouncycastle.crypto.params.KeyParameter;importorg.bouncycastle.crypto.params.ParametersWithIV;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importjavax.crypto.Cipher;importjavax.crypto.spec.SecretKeySpec;importjava.security.Security;importjava.util.Base64;publicclassSM4Util{static{Security.addProvider(newBouncyCastleProvider());}// 加密文件分片publicstaticbyte[]encrypt(byte[]key,byte[]iv,byte[]input)throwsException{PaddedBufferedBlockCiphercipher=newPaddedBufferedBlockCipher(newCBCBlockCipher(newSM4Engine()));cipher.init(true,newParametersWithIV(newKeyParameter(key),iv));byte[]output=newbyte[cipher.getOutputSize(input.length)];intlen=cipher.processBytes(input,0,input.length,output,0);len+=cipher.doFinal(output,len);if(len<output.length){byte[]result=newbyte[len];System.arraycopy(output,0,result,0,len);returnresult;}returnoutput;}// 解密文件分片publicstaticbyte[]decrypt(byte[]key,byte[]iv,byte[]input)throwsException{PaddedBufferedBlockCiphercipher=newPaddedBufferedBlockCipher(newCBCBlockCipher(newSM4Engine()));cipher.init(false,newParametersWithIV(newKeyParameter(key),iv));byte[]output=newbyte[cipher.getOutputSize(input.length)];intlen=cipher.processBytes(input,0,input.length,output,0);len+=cipher.doFinal(output,len);if(len<output.length){byte[]result=newbyte[len];System.arraycopy(output,0,result,0,len);returnresult;}returnoutput;}// 使用JCE方式(备选方案)publicstaticbyte[]encryptJCE(byte[]key,byte[]iv,byte[]input)throwsException{Ciphercipher=Cipher.getInstance("SM4/CBC/PKCS5Padding","BC");SecretKeySpeckeySpec=newSecretKeySpec(key,"SM4");cipher.init(Cipher.ENCRYPT_MODE,keySpec,newjavax.crypto.spec.IvParameterSpec(iv));returncipher.doFinal(input);}}

2. 文件上传控制器 (FileUploadController.java)

importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;importjava.io.File;importjava.io.FileOutputStream;importjava.nio.file.Files;importjava.nio.file.Paths;importjava.util.Base64;importjava.util.UUID;importjava.util.concurrent.ConcurrentHashMap;@RestController@RequestMapping("/api/upload")publicclassFileUploadController{@Value("${file.upload-dir}")privateStringuploadDir;// 临时存储上传状态privatefinalConcurrentHashMapsessions=newConcurrentHashMap<>();// 初始化上传@PostMapping("/init")publicUploadInitResponseinitUpload(@RequestBodyUploadInitRequestrequest){StringfileId=UUID.randomUUID().toString();UploadSessionsession=newUploadSession();session.setFileName(request.getFileName());session.setTotalSize(request.getFileSize());session.setChunkSize(request.getChunkSize());session.setReceivedChunks(0);sessions.put(fileId,session);// 创建临时目录newFile(uploadDir+"/"+fileId).mkdirs();returnnewUploadInitResponse(fileId);}// 上传分片@PostMapping("/chunk")publicvoiduploadChunk(@RequestParam("fileId")StringfileId,@RequestParam("chunkIndex")intchunkIndex,@RequestParam("chunk")MultipartFilechunkFile,@RequestParam("iv")StringivBase64)throwsException{UploadSessionsession=sessions.get(fileId);if(session==null){thrownewRuntimeException("无效的上传会话");}// 解密分片(实际项目中密钥应从安全渠道获取)byte[]key=hexStringToByteArray("你的SM4密钥16字节");// 示例,实际应从配置或安全存储获取byte[]iv=Base64.getDecoder().decode(ivBase64);byte[]encryptedChunk=chunkFile.getBytes();byte[]decryptedChunk=SM4Util.decrypt(key,iv,encryptedChunk);// 保存分片StringchunkPath=uploadDir+"/"+fileId+"/"+chunkIndex;try(FileOutputStreamfos=newFileOutputStream(chunkPath)){fos.write(decryptedChunk);}session.setReceivedChunks(session.getReceivedChunks()+1);}// 完成上传@PostMapping("/complete")publicUploadCompleteResponsecompleteUpload(@RequestBodyUploadCompleteRequestrequest)throwsException{StringfileId=request.getFileId();UploadSessionsession=sessions.get(fileId);if(session==null){thrownewRuntimeException("无效的上传会话");}// 合并分片StringtempDir=uploadDir+"/"+fileId;StringfinalPath=uploadDir+"/"+fileId+".enc";// 加密存储try(FileOutputStreamfos=newFileOutputStream(finalPath)){for(inti=0;i<session.getTotalChunks();i++){byte[]chunk=Files.readAllBytes(Paths.get(tempDir+"/"+i));fos.write(chunk);}}// 清理临时文件Files.walk(Paths.get(tempDir)).sorted((a,b)->b.compareTo(a))// 反向排序先删文件再删目录.forEach(path->{try{Files.delete(path);}catch(Exceptione){// 记录日志}});// 存储文件元信息(实际项目应存入数据库)FileMetameta=newFileMeta();meta.setFileId(fileId);meta.setOriginalName(session.getFileName());meta.setEncryptedPath(finalPath);meta.setSize(session.getTotalSize());// 这里应该将meta保存到数据库returnnewUploadCompleteResponse(fileId,session.getFileName());}// 计算总分片数privateintcalculateTotalChunks(longfileSize,intchunkSize){return(int)Math.ceil((double)fileSize/chunkSize);}// 内部类定义省略...}

信创环境兼容性考虑

  1. 前端兼容性

    • 提供wasm和纯JS两套SM4实现,wasm优先
    • 使用标准的Web API,避免使用实验性功能
    • 测试环境包括:麒麟OS+飞腾CPU、UOS+龙芯等组合
  2. 后端兼容性

    • 使用BouncyCastle作为密码学提供者,兼容国产CPU指令集
    • 避免使用与特定JDK版本绑定的API
    • 测试环境包括:中科方德JDK、华为Kunpeng JDK等

安全考虑

  1. 密钥管理

    • 示例中简化了密钥处理,实际项目应:
    • 使用硬件加密机或软HSM管理主密钥
    • 每个文件使用随机生成的密钥,通过主密钥加密后传输
    • 考虑使用国密SSL/TLS (GMTLS)
  2. 传输安全

    • 所有通信必须通过HTTPS
    • 考虑使用双向SSL认证
  3. 存储安全

    • 服务端存储的是加密后的文件
    • 只有授权用户才能获取解密密钥

性能优化建议

  1. 前端可实现断点续传,记录已上传分片
  2. 后端可使用异步处理合并分片操作
  3. 对于超大文件,考虑使用更高效的存储格式
  4. 实现分片校验机制,确保数据完整性

总结

本方案提供了完整的SM4加密大文件传输实现,从前端分片加密到后端存储都符合国密要求。代码结构清晰,便于进行源代码审查。虽然实现起来比使用现成组件复杂,但完全可控且符合政府单位的安全要求。

下一步工作建议:

  1. 完善密钥管理方案
  2. 增加下载功能实现
  3. 添加更完善的错误处理和日志
  4. 进行全面的性能测试和安全审计

将组件复制到项目中

示例中已经包含此目录

引入组件

配置接口地址

接口地址分别对应:文件初始化,文件数据上传,文件进度,文件上传完毕,文件删除,文件夹初始化,文件夹删除,文件列表
参考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de

处理事件

启动测试

启动成功

效果

数据库

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载

下载续传

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

文件夹下载

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

下载示例

点击下载完整示例

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

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

相关文章

百度WebUploader如何助力网页文件上传下载的解决方案?

Vue大文件上传方案重构&#xff1a;从WebUploader到分片断点续传的实践 作为项目技术负责人&#xff0c;近期在处理4GB级文件上传时遇到WebUploader组件的兼容性瓶颈&#xff08;尤其在IE11及国产浏览器中频繁出现内存溢出&#xff09;。经过两周技术调研与POC验证&#xff0c…

跨平台CKEDITOR粘贴WORD为何在Linux系统下失效?

&#x1f4dd; .NET CMS企业官网Word一键导入功能开发纪实 &#x1f575;️ 技术调研与选型过程 现状分析 作为广西一名.NET全栈开发者&#xff0c;最近接手的企业CMS官网项目需要增强编辑器功能。客户明确要求&#xff1a; 支持Office全家桶(Word/Excel/PPT)和PDF导入保留…

国产化CKEDITOR插件如何解决WORD导入兼容问题?

Word导入与微信公众号内容粘贴功能集成方案 1. 需求分析与评估过程 作为四川某国企的项目负责人&#xff0c;我近期针对企业网站后台管理系统的新功能需求进行了深入调研和评估。需求主要包括&#xff1a; Web编辑器(CKEditor 4)增加Word粘贴功能Word文档导入功能(支持Word/…

DeepSeek + Dify:零成本打造私有化 AI 知识库(下)

读完本文&#xff0c;你将掌握知识库构建的核心技巧&#xff0c;让 AI 基于你的文档准确回答问题&#xff0c;告别"一本正经地胡说八道"。 上篇回顾 上一篇&#xff0c;小禾完成了&#xff1a; Dify 平台部署&#xff08;20 分钟&#xff09;DeepSeek 模型接入&…

蛋白质质谱鉴定前样品制备注意事项

蛋白质质谱鉴定前样品制备注意事项随着高分辨率质谱仪分析技术的发展&#xff0c;蛋白质质谱鉴定的方法已经相当纯熟&#xff0c;一次性鉴定多个蛋白样品&#xff0c;以及低丰度蛋白样品已经不再是难事。但是因为质谱的灵敏度高&#xff0c;外来引入的蛋白质可能会造成质谱鉴定…

第 168 场双周赛Q1——3722. 反转后字典序最小的字符串

题目链接&#xff1a;3722. 反转后字典序最小的字符串&#xff08;中等&#xff09; 算法原理&#xff1a; 解法&#xff1a;暴力枚举 293ms击败14.84% 时间复杂度O(N) 思路很简单&#xff0c;先将最小的字典序字符串minstr设为s&#xff0c;然后翻转前k个和后k个&#xff0c;只…

深入解析:第1章 Shell 脚本入门:从 “Hello World“ 到自动化执行的完整路径

深入解析:第1章 Shell 脚本入门:从 “Hello World“ 到自动化执行的完整路径pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

工业触摸屏:电阻式触摸屏详解

工业触摸屏&#xff1a;电阻式触摸屏详解 电阻式触摸屏&#xff08;Resistive Touchscreen&#xff09;是最早商用化的触摸技术之一&#xff0c;以成本低、耐用性强著称&#xff0c;尤其在工业领域长期占据重要地位。下面我从原理、结构、类型、优缺点、工作过程以及工业应用等…

桨叶干燥机评测2026:耐用性佳的厂家产品盘点,喷雾干燥机/桨叶干燥机/干燥机/闪蒸干燥机,桨叶干燥机定制厂家推荐排行

在化工、制药、食品等工业领域,桨叶干燥机作为核心设备,其性能稳定性直接影响企业生产效率与成本控制。据行业权威机构2025年最新数据显示,国内桨叶干燥机市场规模已突破百亿元,但设备耐用性、能效比及环保合规性仍…

2026年河北热门橡胶制品定制生产厂排名,哪家更值得选?

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为工业制造企业选型提供客观依据,助力精准匹配适配的橡塑制品服务伙伴。 TOP1 推荐:河北楠铭橡塑制品有限公司 推荐指数:★★★★★ | 口碑评分:…

四季南山倍贝高HMO奶粉、奕骼奶粉、A2奶粉详细对比评测

在健康中国战略深入推进的当下,精准营养已成为国民健康管理的核心需求。从学龄儿童的身高发育焦虑到中老年群体的骨骼健康困扰,不同年龄段人群对营养补充的细分诉求日益凸显。面对市场上琳琅满目的营养食品品牌,如何…

水用金属软管品牌的价格对比情况如何,一起来看看

问题1:市场上水用金属软管品牌众多,如何判断哪些品牌性价比更高?性价比的核心衡量维度是什么? 判断水用金属软管品牌的性价比,不能只看价格低,而要结合材质可靠性、工艺精度、服务保障、全生命周期成本四大核心维…

2026年真空波纹管大型厂家排名,恒达管业实力出众

在工业精密系统中,真空波纹管是保障设备稳定运行的隐形纽带,直接关系到真空环境的密封性与动态补偿能力。面对市场上良莠不齐的真空波纹管厂商,如何挑选口碑好、实力强的合作伙伴?以下结合行业特性与用户痛点,为你…

远航健康可以信任吗,有什么信任背书来保障?

问题1:很多人问远航健康口碑怎么样,它的核心服务真能解决精英群体的健康痛点吗? 远航健康的口碑在政商精英圈层里一直保持着高认可度,这背后是它精准击中了精英群体的核心健康痛点——比如终身服药的慢病困扰高压下…

2026年服务不错的装修设计专业公司排行榜,昆明欢乐佳园排前列

2026年家装消费升级浪潮下,靠谱的装修设计企业已成为业主规避行业陷阱、实现品质居住的核心保障。无论是应对昆明潮湿气候的针对性工艺、全案服务的省心体验,还是杜绝增项的透明报价体系,优质装修设计品牌企业的专业…

16APSK/32APSK调制解调MATLAB仿真实现

一、仿真系统架构 %% 参数设置 N = 10000; % 符号数 M16 = [4,12]; % 16APSK环结构 M32 = [4,12,16]; % 32APSK环结构 radii16 = [1,2]; % 16APSK半径 radii32 = [0.6,1.2,1.8]; % 32APSK半径 sn…

鸿蒙Harmony实战开发教学(No.8)-Hyperlink超链接组件基础到进阶篇 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

导师推荐9个AI论文网站,自考学生轻松搞定毕业论文!

导师推荐9个AI论文网站&#xff0c;自考学生轻松搞定毕业论文&#xff01; AI 工具助力论文写作&#xff0c;自考学生也能轻松应对 随着人工智能技术的不断进步&#xff0c;AI 工具在学术领域的应用越来越广泛&#xff0c;尤其对于自考学生而言&#xff0c;它们成为了完成毕业…

2026年潜水搅拌机制造商排名,哪家按需定制服务好?

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家潜水搅拌机领域标杆企业,为环保工程、工业废水处理等领域的企业选型提供客观依据,助力精准匹配适配的设备供应商。 TOP1 推荐:南京维克环保科技有限公司 推…

2026年安徽靠谱的黄精供应商排名,看看都有谁?

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为企业选型提供客观依据,助力精准匹配适配的黄精茶代加工生产企业与黄精供应商。 TOP1 推荐:安徽尚沣园健康科技发展有限公司 推荐指数:★★★★…