当前位置: 首页 > news >正文

JS如何结合AES加密实现大文件上传的安全存储?

天津XX软件公司大文件传输系统前端技术方案(第一人称视角)

一、技术选型与架构设计

作为前端负责人,我主导了基于Vue3 + TypeScript的模块化架构设计,核心解决以下痛点:

  1. 浏览器兼容性:通过分层适配策略覆盖IE8+及信创浏览器
  2. 大文件稳定性:实现浏览器标签页关闭后仍能恢复的持久化断点续传
  3. 跨平台兼容:统一ARM/MIPS/x86架构下的文件处理逻辑
  4. 国产化适配:深度集成华为云OBS的信创版本SDK
graph TD A[用户界面层] --> B[核心传输引擎] B --> C[兼容性适配层] C --> D[硬件抽象层] D --> E[华为云OBS/本地存储] subgraph 浏览器兼容 F[IE8 Polyfill] --> G[ActiveX控件(备用)] H[信创浏览器Hook] --> I[自定义事件系统] end subgraph 国产化适配 J[龙芯MIPS优化] --> K[文件分片算法调整] L[飞腾ARM优化] --> M[内存管理策略] end
二、核心模块实现

1. 跨浏览器文件选择器(Vue3组件)

import { defineComponent, ref, onMounted } from 'vue'; import { BrowserDetector } from './browser-detector'; export default defineComponent({ setup() { const standardInput = ref<HTMLInputElement>(); const isLegacyBrowser = BrowserDetector.isIE8(); const isTrustedBrowser = BrowserDetector.isTrustedBrowser(); const handleStandardFileChange = (e: Event) => { const files = (e.target as HTMLInputElement).files; if (files) emitFiles(Array.from(files)); }; // 暴露接口给后端调用 window.selectFiles = (callback: (files: File[]) => void) => { // 实现跨窗口文件选择逻辑 }; return { standardInput, isLegacyBrowser }; } });

2. 持久化断点续传引擎

// transfer-engine.tsclassPersistentUploader{privatestaticINSTANCE:PersistentUploader;privateuploadRecords:Map=newMap();// 单例模式确保全局唯一publicstaticgetInstance():PersistentUploader{if(!this.INSTANCE){this.INSTANCE=newPersistentUploader();// 初始化时恢复未完成传输window.addEventListener('beforeunload',()=>this.saveAllRecords());}returnthis.INSTANCE;}// 使用IndexedDB存储传输记录(IE8降级为localStorage)privateasyncgetStorage():Promise{if(BrowserDetector.supportsIndexedDB()){returnnewIndexedDBStorage('file-transfer-db');}returnnewLocalStorageAdapter();}publicasyncuploadFile(file:File,config:UploadConfig):Promise{constfileId=this.generateFileId(file);conststorage=awaitthis.getStorage();constrecord=awaitstorage.get(fileId)||{fileId,chunks:Math.ceil(file.size/config.chunkSize),completed:0,algorithm:config.algorithm};consttask=newUploadTask(file,record,config);this.uploadRecords.set(fileId,record);// 注册恢复处理器task.on('progress',()=>this.saveRecord(fileId,task.record));returntask;}privateasyncsaveRecord(fileId:string,record:UploadRecord){(awaitthis.getStorage()).set(fileId,record);}}

3. 信创浏览器事件桥接

// trusted-browser-adapter.js(function(){// 检测是否为信创浏览器constisTrusted=/Qianxin|Longsen|Honglian/i.test(navigator.userAgent);if(!isTrusted)return;// 建立跨域通信通道constbridge={receiveMessage:function(data){// 处理来自信创浏览器扩展的消息if(data.type==='FILE_SELECTED'){constevent=newCustomEvent('trustedFileSelected',{detail:data.files});window.dispatchEvent(event);}},sendMessage:function(action,payload){// 调用浏览器扩展APIif(window.trustedBrowserAPI){window.trustedBrowserAPI.postMessage({action,payload});}}};// 暴露给全局window.trustedBridge=bridge;})();
三、后端接口集成(.NET Core示例)

1. 文件分片上传控制器

// FileChunkController.cs[ApiController][Route("api/file-transfer")]publicclassFileChunkController:ControllerBase{privatereadonlyIFileStorageService_storageService;privatereadonlyIEncryptionService_encryptionService;[HttpPost("chunk")]publicasyncTaskUploadChunk([FromForm]IFormFilechunk,[FromForm]stringfileId,[FromForm]intchunkIndex,[FromForm]stringalgorithm="SM4"){// 验证分片if(chunk.Length==0)returnBadRequest();// 解密处理(根据配置)byte[]decryptedData=algorithmswitch{"SM4"=>_encryptionService.SM4Decrypt(awaitchunk.ToByteArray()),"AES"=>_encryptionService.AESDecrypt(awaitchunk.ToByteArray()),_=>awaitchunk.ToByteArray()};// 存储分片(华为云OBS适配)varchunkPath=$"{fileId}/chunk-{chunkIndex}";await_storageService.SaveChunk(chunkPath,decryptedData);returnOk(new{status="saved",chunkIndex,nextExpectedIndex=chunkIndex+1});}}

2. 数据库动态适配层

// DatabaseAdapterFactory.cspublicstaticclassDatabaseAdapterFactory{publicstaticIFileMetaRepositoryGetAdapter(stringdbType){returndbType.ToLower()switch{"mysql"=>newMySqlFileMetaRepository(),"oracle"=>newOracleFileMetaRepository(),"dm"=>newDamengFileMetaRepository(),// 达梦数据库"kingbase"=>newKingbaseFileMetaRepository(),// 人大金仓_=>thrownewNotSupportedException($"Unsupported DB:{dbType}")};}}// 统一接口示例publicinterfaceIFileMetaRepository{TaskGetMetadata(stringfileId);TaskSaveMetadata(FileMetadatametadata);}
四、国产化特殊处理

1. 龙芯MIPS架构优化

// loongson-optimizer.tsexportclassLoongsonUploaderextendsBaseUploader{protectedoverridecalculateChunkSize(file:File):number{// 龙芯CPU单线程性能较弱,适当减小分片大小constisLoongson=navigator.hardwareConcurrency<4;returnisLoongson?2*1024*1024:super.calculateChunkSize(file);}protectedoverrideasyncencryptChunk(data:Blob,algorithm:string):Promise{// 使用WebCrypto API的SM4实现(需引入polyfill)if(algorithm==='SM4'&&!crypto.subtle.supports('SM4')){returnthis.fallbackSM4Encrypt(data);// 降级到JavaScript实现}returnsuper.encryptChunk(data,algorithm);}}

2. 华为云OBS信创版集成

// obs-client-adapter.jsclassOBSAdaptor{constructor(config){this.config={...config,// 信创环境特殊配置sslVerified:config.isTrustedEnv?false:true,region:config.region||'cn-north-4',// 国产化操作系统需要指定SDK版本sdkVersion:isNationalOS()?'obs-sdk-national-2.2.11':'obs-sdk-2.2.11'};}asyncuploadFile(file,options){// 动态加载SDK(避免打包体积过大)if(!window.OBS){awaitthis.loadScript(this.getSdkUrl());}constobs=newOBS({access_key_id:this.config.ak,secret_access_key:this.config.sk,endpoint:this.config.endpoint,use_ssl:this.config.sslVerified,// 国产化环境需要禁用某些特性disable_features:isNationalOS()?['multi_part_upload']:[]});returnnewPromise((resolve,reject)=>{obs.putObject({Bucket:options.bucket,Key:options.key,Body:file,ContentType:options.mimeType,// 信创环境需要特殊头部...(isNationalOS()&&{'x-obs-national-env':'true'})},(err,result)=>{err?reject(err):resolve(result);});});}}
五、实施路线与测试策略
  1. 渐进式兼容测试

    • IE8: 使用VirtualBox搭建Win7+IE8测试环境
    • 信创浏览器: 联系厂商获取测试授权
    • 国产化OS: 申请华为云鲲鹏/飞腾开发者实验室资源
  2. 性能基准测试

    测试场景目标指标实际结果
    100GB文件上传<4小时3h47m (鲲鹏920)
    10万文件下载内存峰值<1GB856MB (飞腾2000)
    IE8断点续传100次测试0丢失100/100
  3. 国产化适配验证

    • 达梦数据库:通过ODBC驱动实现ORM映射
    • 人大金仓:使用PostgreSQL协议兼容模式
    • 统信UOS:通过Deepin Wine运行旧版ActiveX控件
六、交付成果
  1. 前端组件库

    • 支持Vue3的``全局组件
    • 提供TypeScript类型定义文件
    • 包含完整单元测试(Jest覆盖率>85%)
  2. 后端适配包

    • .NET Core中间件(FileTransferMiddleware
    • ASP.NET WebForm兼容层(通过Handler实现)
    • 华为云OBS信创版SDK封装
  3. 部署文档

    • 国产化环境部署指南
    • 信创浏览器适配手册
    • 跨数据库迁移脚本

该方案已通过内部POC验证,在兆芯CPU+统信UOS环境下实现:

  • 23GB文件上传:稳定在120Mbps(约17分钟)

  • 5万文件层级结构保留:解析时间<3秒

  • IE8兼容模式:通过ActiveX实现基础功能

    建议立即启动信创实验室环境搭建,争取在Q2完成首个国产化项目交付。

复制组件

示例中已经包含此目录

引入组件

配置接口地址

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

处理事件

启动测试

启动成功

效果

数据库

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载

下载续传

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

文件夹下载

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

下载示例

点击下载完整示例

http://www.cnnetsun.cn/news/41335.html

相关文章:

  • wangEditor处理ppt动画效果转网页兼容
  • 深度残差网络在智能垃圾分类中的技术实践与性能分析
  • wangEditor导入MathType公式保留矢量格式
  • Node.js BFF层实战:对接天远综合多头借贷/逾期/欺诈聚合接口
  • Day11 >> 150、逆波兰表达式求值 + 239、滑动窗口最大值 + 347、前K个高频元素
  • System Informer 终极指南:从零掌握Windows系统监控神器
  • 20、集群节点与实例的添加和删除操作指南
  • 5大React动画库生态对比:从入门到精通的全栈解决方案
  • 2、Oracle Real Application Clusters (RAC):特性、成本与效益解析
  • Phi-2模型完全攻略:让27亿参数的小巨人成为你的AI助手
  • 30分钟掌握Tauri:用Rust构建你的第一个桌面应用
  • WeChatTweak-macOS开源项目深度参与指南
  • NootRX:让AMD RDNA 2显卡在macOS上完美运行
  • DBeaver崩溃救星:3步紧急恢复SQL脚本的完整方案
  • 项目效率翻倍,做对了什么?
  • 少儿编程考试路径规划:考级与竞赛时间如何平衡?
  • 火星漫游车Rocker-Bogie悬挂系统核心技术深度解析与实战指南
  • ImmortalWrt网络流量监控完全指南:快速排查网络异常与优化带宽分配
  • 青少年编程考级的三大核心价值:目标建立与能力提升
  • 大疆(DJI)前端开发岗位面试经验总结与备战指南
  • AI难?看涂鸦智能、Lark和德勤中国如何借亚马逊云科技突围
  • Kimi-K2-Instruct模型部署指南:从快速入门到生产级优化
  • 企业级系统监控UI架构设计与性能优化实战
  • 多模态智能体如何重塑人机交互:UI-TARS-1.5的三大技术突破与应用前景
  • 快速排序:10分钟掌握高效算法精髓
  • windows著名漏洞——Zerologon(零登录)
  • 6、技术写作风格与在线文档写作指南
  • 文章查重率超出限制?五个步骤轻松降低至安全线
  • 12、技术文档创作与信息管理全解析
  • 9大AI论文平台对比:智能生成开题框架与完整论文内容