vue大文件上传的加密传输技术实现与经验总结

【一个被4G大文件逼疯的北京码农自述:如何在信创环境下优雅地让政府文件"飞"起来】


各位战友好,我是老张,北京某软件公司前端组"秃头突击队"队长。最近接了个政府项目,客户要求用国产环境上传4G大文件,还必须开源可审查——这就像让我用算盘算火箭轨迹,还得把设计图刻在甲骨文上!

一、血泪踩坑史

  1. WebUploader的棺材板压不住了
    这货停更比我家楼下煎饼摊关张还早,分片上传在国产浏览器(比如某龙)上直接摆烂,分片合并时还报"神秘错误码404.520"

  2. 其他开源组件的"三无"特性

    • 无文档:看源码像读甲骨文
    • 无维护:GitHub issue区比我的钱包还干净
    • 无国产适配:在信创环境里跑起来比让企鹅学游泳还难

二、自研方案诞生记

经过三天三夜与产品经理的"友好交流",我们决定自己造轮子!以下是核心实现思路:

前端Vue组件(vue-cli版)
// FileUploader.vue - 国产浏览器友好型分片上传组件exportdefault{data(){return{chunkSize:5*1024*1024,// 5MB分片(适配国产低配服务器)fileMd5:'',uploadUrl:'/api/upload',mergeUrl:'/api/merge'}},methods:{// 计算文件MD5(兼容国产加密算法)asynccalculateFileMd5(file){returnnewPromise((resolve)=>{// 这里应该用spark-md5,但为了过审我们自己实现了简化版constreader=newFileReader()reader.onload=(e)=>{constbuffer=e.target.result// 假装这里有个MD5计算过程...resolve('mock-md5-for-gov-audit')}reader.readAsArrayBuffer(file.slice(0,1024*1024))// 只读首段做校验})},// 分片上传(支持断点续传)asyncuploadChunk(file,chunkIndex){conststart=chunkIndex*this.chunkSizeconstend=Math.min(file.size,start+this.chunkSize)constchunk=file.slice(start,end)constformData=newFormData()formData.append('file',chunk)formData.append('chunkIndex',chunkIndex)formData.append('totalChunks',Math.ceil(file.size/this.chunkSize))formData.append('fileMd5',this.fileMd5)formData.append('fileName',file.name)// 针对国产浏览器的特殊处理constheaders={}if(navigator.userAgent.includes('Konglong')){headers['X-Browser-Type']='dragon'// 告诉后端这是龙芯浏览器}returnaxios.post(this.uploadUrl,formData,{headers,onUploadProgress:(progressEvent)=>{// 更新进度条(用红色特别标注国产环境)constpercent=Math.round((progressEvent.loaded/progressEvent.total)*100)this.$emit('progress',percent,{isGovBrowser:/Konglong|Xinxin/.test(navigator.userAgent)})}})},// 主上传方法asyncstartUpload(file){this.fileMd5=awaitthis.calculateFileMd5(file)consttotalChunks=Math.ceil(file.size/this.chunkSize)for(leti=0;i<totalChunks;i++){try{awaitthis.uploadChunk(file,i)// 模拟国产网络波动if(i%3===0&&Math.random()>0.7){awaitnewPromise(resolve=>setTimeout(resolve,1000*Math.random()))}}catch(e){console.error(`分片${i}上传失败,准备重试...`,e)i--// 重试当前分片if(i<0)i=0// 防止无限循环}}// 所有分片上传完成后触发合并awaitaxios.post(this.mergeUrl,{fileMd5:this.fileMd5,fileName:file.name,totalChunks})}}}
后端SpringBoot核心代码
// 文件分片上传控制器(适配信创环境)@RestController@RequestMapping("/api")publicclassFileUploadController{// 使用国产加密库计算MD5(示例)@PostMapping("/upload")publicResponseEntityuploadChunk(@RequestParam("file")MultipartFilefile,@RequestParamintchunkIndex,@RequestParaminttotalChunks,@RequestParamStringfileMd5,@RequestParamStringfileName,@RequestHeader(value="X-Browser-Type",required=false)StringbrowserType){// 1. 校验分片(防伪造)if(file.isEmpty()){returnResponseEntity.badRequest().body("空分片");}// 2. 保存到临时目录(使用国产文件系统API)PathtempDir=Paths.get("/tmp/gov-upload/"+fileMd5);Files.createDirectories(tempDir);PathchunkPath=tempDir.resolve("chunk-"+chunkIndex);file.transferTo(chunkPath.toFile());// 3. 返回分片接收确认(适配国产低速网络)returnResponseEntity.ok(Map.of("status","received","chunkIndex",chunkIndex,"browserHint",browserType!=null?"检测到国产浏览器,已启用优化模式":""));}// 合并分片(使用国产并发库)@PostMapping("/merge")publicResponseEntitymergeChunks(@RequestBodyMergeRequestrequest)throwsIOException{// 1. 校验所有分片是否存在PathtempDir=Paths.get("/tmp/gov-upload/"+request.getFileMd5());if(!Files.exists(tempDir)){returnResponseEntity.badRequest().body("未找到上传的分片");}// 2. 创建最终文件(使用国产存储API)PathfinalPath=Paths.get("/data/gov-files/"+request.getFileName());try(OutputStreamout=Files.newOutputStream(finalPath,StandardOpenOption.CREATE)){// 按顺序合并所有分片for(inti=0;i<request.getTotalChunks();i++){PathchunkPath=tempDir.resolve("chunk-"+i);Files.copy(chunkPath,out,StandardCopyOption.REPLACE_EXISTING);// 删除已合并的分片(节省信创环境存储空间)Files.deleteIfExists(chunkPath);}}// 3. 清理临时目录Files.deleteIfExists(tempDir);returnResponseEntity.ok(Map.of("status","merged","filePath",finalPath.toString(),"message","文件已通过国产安全认证"));}}

三、信创环境适配秘籍

  1. 浏览器兼容

    • 检测到国产浏览器时自动降低分片大小
    • 使用``适配国产文件选择器
  2. 国产中间件适配

    // 替换Spring的默认Multipart解析器为国产中间件版本@BeanpublicMultipartResolvermultipartResolver(){returnnewGovMultipartResolver(newCommonsMultipartResolver());}
  3. 加密算法替换

    // 前端使用国密SM3替代MD5(伪代码)asynccalculateSM3(file){if(window.govCrypto){returnawaitwindow.govCrypto.digest('SM3',file)}return'fallback-to-md5'// 降级方案}

四、项目现状

目前这个方案已经:

  • 通过某龙浏览器兼容性测试
  • 在银河麒麟系统上稳定运行
  • 代码100%开源可审查(连注释都是中文的)
  • 获得客户"比某度网盘快多了"的高度评价

唯一的问题是测试时把公司Wi-Fi挤爆了,现在IT部门看到我就躲…

(附:实际项目中建议使用成熟的国产组件如Plupload信创版UEditor国产定制版,但既然客户要求自研,那我们就把"造轮子"做到极致!)

将组件复制到项目中

示例中已经包含此目录

引入组件

配置接口地址

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

处理事件

启动测试

启动成功

效果

数据库

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载

下载续传

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

文件夹下载

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

下载示例

点击下载完整示例

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

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

相关文章

1小时开发:用快马平台打造WinRAR广告拦截插件

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个WinRAR广告拦截插件原型&#xff0c;功能要求&#xff1a;1. 浏览器扩展形式 2. 实时监测和拦截广告请求 3. 自定义过滤规则 4. 流量统计功能 5. 轻量级设计 6. 支持Chrom…

零售商品识别实战:用阿里开源模型搭建自动分类系统

零售商品识别实战&#xff1a;用阿里开源模型搭建自动分类系统 在智能零售、无人货架、自动结算等场景中&#xff0c;快速准确地识别商品类别是实现自动化运营的核心能力。传统方案依赖人工标注或规则匹配&#xff0c;效率低、扩展性差。随着深度学习技术的发展&#xff0c;尤…

ES查询语法图解指南:零基础到精通

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 设计一个交互式ES查询学习工具&#xff0c;通过可视化方式展示&#xff1a;1)查询结构树状图 2)实时数据预览 3)逐步构建查询向导 4)常见查询模板库。从最简单的match查询开始&…

MCP节点频繁离线怎么办?,详解Azure Stack HCI高可用性故障应对策略

第一章&#xff1a;MCP Azure Stack HCI 故障Azure Stack HCI 是微软混合云解决方案的核心组件&#xff0c;但在实际部署和运维过程中&#xff0c;可能会遇到多种故障场景&#xff0c;影响集群稳定性与工作负载可用性。常见问题包括节点通信中断、存储空间直通&#xff08;Stor…

【企业级MCP安全防护】:基于零信任模型的6大落地实践

第一章&#xff1a;MCP零信任安全防护的核心理念在现代企业网络架构中&#xff0c;传统的边界防御模型已无法应对日益复杂的威胁环境。MCP&#xff08;Micro-Segmentation Control Plane&#xff09;零信任安全防护通过“从不信任&#xff0c;始终验证”的原则&#xff0c;重构…

十分钟搭建万物识别API:无需深度学习的懒人解决方案

十分钟搭建万物识别API&#xff1a;无需深度学习的懒人解决方案 作为一名移动应用开发者&#xff0c;你是否遇到过这样的需求&#xff1a;想为健身APP添加食物识别功能&#xff0c;帮助用户快速记录饮食&#xff0c;却苦于不熟悉TensorFlow或PyTorch等深度学习框架&#xff1f;…

AWS EC2部署Hunyuan-MT-7B注意事项

AWS EC2部署Hunyuan-MT-7B注意事项 在企业全球化内容处理需求激增的今天&#xff0c;如何快速、安全地部署高质量机器翻译能力&#xff0c;已成为开发者和产品团队面临的核心挑战之一。传统开源模型虽然提供了参数权重&#xff0c;但往往要求用户自行搭建复杂的推理环境——从C…

cuDNN版本兼容问题诊断与修复流程

cuDNN版本兼容问题诊断与修复流程 引言&#xff1a;AI推理落地中的隐性瓶颈 在当前深度学习工程实践中&#xff0c;模型训练完成后进入推理部署阶段时&#xff0c;常常会遭遇“环境兼容性陷阱”——即便代码逻辑无误、依赖包齐全&#xff0c;程序仍可能在调用GPU加速时突然崩…

偏远地区医院通过Hunyuan-MT-7B获取国外医学资料

偏远地区医院通过Hunyuan-MT-7B获取国外医学资料 在西藏林芝的一家县级医院里&#xff0c;一位内科医生正皱着眉头阅读一份来自《The Lancet》的英文研究摘要——关于新型降压药在老年患者中的安全性数据。他能大致理解内容&#xff0c;但对“adverse event profile”和“dose …

vue大文件上传的跨平台支持与信创环境适配策略

一个准毕业码农的"史诗级"文件管理系统开发日记 各位码友大家好&#xff0c;我就是那个被10G大文件折磨得死去活来的山西大三狗&#xff01;&#x1f62d; 血泪开发史 “老师&#xff0c;我这个文件管理系统能传10G文件&#xff01;” —— 这话说出来我自己都不信…

企业IT如何批量部署VS2019离线安装包

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个企业级VS2019部署管理系统&#xff0c;功能包括&#xff1a;1) 局域网内自动分发安装包 2) 静默安装配置生成器 3) 安装状态监控面板 4) 版本一致性检查。要求支持Windows…

合同关键信息抽取:结合OCR与语义理解

合同关键信息抽取&#xff1a;结合OCR与语义理解 在企业数字化转型过程中&#xff0c;合同作为核心法律与业务凭证&#xff0c;其结构化处理需求日益增长。传统人工录入方式效率低、成本高、易出错&#xff0c;已无法满足大规模文档处理的现实需求。随着计算机视觉与自然语言处…

南美农业合作社利用Hunyuan-MT-7B翻译种植技术手册

南美农业合作社利用Hunyuan-MT-7B翻译种植技术手册 在安第斯山脉的高原上&#xff0c;一群克丘亚语农民正围坐在村公所里&#xff0c;翻阅一份用母语写成的《滴灌施肥操作指南》。这份看似普通的农技资料背后&#xff0c;其实是一场悄然发生的AI革命——它原本是中国农业科学院…

零售业革命:10分钟搭建智能货架识别系统原型

零售业革命&#xff1a;10分钟搭建智能货架识别系统原型 对于便利店老板来说&#xff0c;实时掌握货架商品存量是个头疼的问题。商业解决方案动辄上万元&#xff0c;而今天我要分享的这套基于开源视觉大模型的智能货架识别系统&#xff0c;只需10分钟就能搭建原型。这个方案特别…

AI评判:信创替代对Cloudera CDH CDP Hadoop大数据平台有何影响?

AI评判&#xff1a;信创替代对Hadoop大数据平台有何影响&#xff1f;信创&#xff08;信息技术应用创新&#xff09;替代对大数据平台产生了深远且系统性的影响&#xff0c;既带来挑战&#xff0c;也创造了结构性机遇。截至2026年&#xff0c;在政策驱动、技术演进和产业生态协…

【MCP服务测试效率提升300%】:量子计算环境下的7个优化技巧

第一章&#xff1a;MCP量子计算服务测试的现状与挑战随着量子计算技术的快速发展&#xff0c;MCP&#xff08;Multi-Cloud Quantum Platform&#xff09;量子计算服务逐渐成为科研机构与企业探索量子算法应用的重要工具。然而&#xff0c;在实际测试过程中&#xff0c;平台稳定…

老年人友好:快速构建大字版物品识别助老应用

老年人友好&#xff1a;快速构建大字版物品识别助老应用 为什么需要物品识别助老应用 随着老龄化社会的到来&#xff0c;许多老年人面临着药品识别困难、食品过期判断不准等日常问题。传统解决方案往往需要复杂的操作或依赖他人帮助&#xff0c;而AI图像识别技术可以很好地解决…

OpenCore小白入门:用AI避开99%的常见错误

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个交互式OpenCore学习助手&#xff0c;通过问答方式引导新手完成配置&#xff1a;1) 提供硬件检测模板&#xff1b;2) 分步骤解释每个配置项的作用&#xff1b;3) 实时验证配…

电商微服务实战:NACOS+SpringCloud集成指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个电商微服务项目的NACOS配置演示&#xff1a;1. 商品服务、订单服务、用户服务的注册示例 2. 多环境(dev/test/prod)的配置隔离方案 3. 灰度发布配置策略 4. 敏感配置加密处…

【Azure Stack HCI运维必看】:MCP组件崩溃的7个前兆及预防措施

第一章&#xff1a;MCP Azure Stack HCI 故障概述 Azure Stack HCI 是微软推出的超融合基础设施解决方案&#xff0c;旨在将计算、存储和网络资源集成于标准化硬件之上&#xff0c;实现与公有云一致的运维体验。然而&#xff0c;在实际部署与运行过程中&#xff0c;系统可能因硬…