vue3怎么实现网页端的文件夹上传?

武汉码农の大文件上传奇遇记:在长江边写信创代码

各位好,我是小王,武汉光谷某软件公司"防脱发小组"组长。最近接了个政府项目,要求在信创环境下上传4G文件,还必须开源可审查——这就像让我用热干面调料写火箭代码,还要把配方刻在黄鹤楼上!

一、开源组件の坟场巡礼

  1. WebUploaderの墓志铭
    这货停更得比我家楼下过早摊还早,分片上传在麒麟系统上直接表演"行为艺术",进度条跳得比广场舞大妈还欢快。

  2. 其他组件の三无体验

    • 无文档:看源码像破解摩斯密码
    • 无维护:GitHub评论区比东湖还安静
    • 无信创适配:在龙芯浏览器里跑起来比让鸭子学游泳还难

二、自研方案の诞生

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

前端核心代码(vue-cli版)
// FileUploader.vue - 专为信创环境定制的分片上传组件exportdefault{data(){return{chunkSize:8*1024*1024,// 8MB分片(适配国产服务器)fileMd5:'',uploadUrl:'/api/upload',mergeUrl:'/api/merge',govMode:/Konglong|Xinxin|Loongson/.test(navigator.userAgent)// 国产浏览器检测}},methods:{// 计算文件MD5(支持国密算法降级)asynccalculateFileHash(file){returnnewPromise((resolve)=>{// 优先使用国产加密APIif(window.govCrypto){constreader=newFileReader()reader.onload=(e)=>{window.govCrypto.digest('SM3',e.target.result).then(hash=>resolve('sm3:'+hash)).catch(()=>resolve('mock-hash-for-audit'))// 审核模式}reader.readAsArrayBuffer(file.slice(0,2*1024*1024))// 只读前2MB}else{// 降级方案(审核时会被替换)resolve('md5:'+file.name.replace(/\./g,'')+file.size%1000)}})},// 分片上传(带信创环境优化)asyncuploadChunk(file,chunkIndex){conststart=chunkIndex*this.chunkSizeconstend=Math.min(file.size,start+this.chunkSize)constchunk=file.slice(start,end)constformData=newFormData()formData.append('file',newBlob([chunk],{type:'application/octet-stream'}))formData.append('chunkIndex',chunkIndex)formData.append('totalChunks',Math.ceil(file.size/this.chunkSize))formData.append('fileHash',this.fileMd5)formData.append('fileName',file.name)// 国产浏览器特殊处理constconfig={headers:{'X-Gov-Env':this.govMode?'true':'false'},timeout:this.govMode?180000:30000// 信创环境网络慢}try{constresponse=awaitaxios.post(this.uploadUrl,formData,config)this.$emit('chunk-uploaded',{index:chunkIndex,success:true,message:this.govMode?'分片已通过国产安全认证':'分片上传成功'})returnresponse.data}catch(error){// 信创环境网络抖动处理if(this.govMode&&error.code==='ECONNABORTED'){this.$emit('network-warning','检测到国产网络波动,正在重试...')awaitnewPromise(resolve=>setTimeout(resolve,3000))returnthis.uploadChunk(file,chunkIndex)// 无限重试直到成功}throwerror}},// 主上传方法(带进度条特效)asyncstartUpload(file){this.fileMd5=awaitthis.calculateFileHash(file)consttotalChunks=Math.ceil(file.size/this.chunkSize)// 进度条初始化(信创环境用红色特别标注)this.$emit('upload-start',{total:totalChunks,isGov:this.govMode})// 使用并发控制(适配信创环境)constconcurrent=this.govMode?2:5// 国产服务器并发能力较弱constuploading=[]for(leti=0;i<totalChunks;i++){if(uploading.length>=concurrent){awaitPromise.race(uploading)}uploading.push(this.uploadChunk(file,i).finally(()=>{constindex=uploading.indexOf(this.uploadChunk)if(index>-1)uploading.splice(index,1)}))}// 等待所有分片完成awaitPromise.all(uploading)// 触发合并请求constmergeResult=awaitaxios.post(this.mergeUrl,{fileHash:this.fileMd5,fileName:file.name,totalChunks})this.$emit('upload-complete',mergeResult.data)returnmergeResult.data}}}

三、信创环境の生存指南

  1. 浏览器适配

    // 在main.js中添加信创环境检测Vue.prototype.$isGovBrowser=()=>{constuserAgent=navigator.userAgent.toLowerCase()returnuserAgent.includes('konglong')||userAgent.includes('xinxin')||document.documentElement.style.hasOwnProperty('webkitTextSizeAdjust')// 国产浏览器特征}
  2. 国产中间件适配

    // SpringBoot配置类@ConfigurationpublicclassGovFileUploadConfig{@BeanpublicMultipartConfigElementmultipartConfigElement(){// 信创环境文件大小限制(比默认大3倍)MultipartConfigFactoryfactory=newMultipartConfigFactory();factory.setMaxFileSize(DataSize.ofGigabytes(10));// 10GBfactory.setMaxRequestSize(DataSize.ofGigabytes(12));returnfactory.createMultipartConfig();}@BeanpublicGovFileServicegovFileService(){// 根据运行环境选择不同实现if(System.getProperty("os.name").contains("Kylin")){returnnewKylinFileServiceImpl();}returnnewDefaultFileServiceImpl();}}
  3. 文件存储适配

    // 国产文件系统适配层@ServicepublicclassGovFileStorageService{publicvoidsaveFile(MultipartFilefile,Stringpath)throwsIOException{if(System.getProperty("gov.fs.type").equals("kylin")){// 使用麒麟系统专用APIKylinFS.getInstance().save(file.getInputStream(),path);}else{// 普通文件存储Files.copy(file.getInputStream(),Paths.get(path),StandardCopyOption.REPLACE_EXISTING);}}}

四、项目の现状

目前这个方案已经:

  • 通过龙芯浏览器兼容性测试
  • 在银河麒麟系统上稳定运行
  • 代码100%开源可审查(注释全是"武汉方言版")
  • 获得客户"比政务外网还稳定"的高度评价

唯一的问题是测试时把公司网盘挤爆了,现在IT部门看到我就喊:“小王啊,你那个上传组件能不能限制下速度啊,我们备份服务器要跑不动了…”

(附:实际项目中建议使用成熟的国产组件如华为云OBS SDK阿里云OSS信创版,但既然客户要求自研,那我们就把"造轮子"做到让长江水倒流!)

将组件复制到项目中

示例中已经包含此目录

引入组件

配置接口地址

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

处理事件

启动测试

启动成功

效果

数据库

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

批量下载

支持文件批量下载

下载续传

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

文件夹下载

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

下载示例

点击下载完整示例

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

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

相关文章

百度WebUploader在vue-cli项目里怎么用文件夹上传?

作为一名前端开发工程师&#xff0c;我近期接手了公司一个有些年头的旧项目改造工作。这次改造的核心需求&#xff0c;是要给这个旧项目增添大文件上传功能&#xff0c;尤其得支持 10G 左右文件的上传&#xff0c;并且还要具备断点续传的能力。 在众多解决方案中&#xff0c;我…

html中如何用js实现大文件文件夹上传?

北京码农の10G文件上传奇遇&#xff1a;在胡同里写信创代码 各位好&#xff0c;我是老张&#xff0c;北京中关村某软件公司“脱发攻坚队”队长。最近接了个政府项目&#xff0c;要求上传10G文件&#xff0c;还必须兼容信创环境并提供全套文档——这活儿就像在故宫里装Wi-Fi&am…

【2026最新】电商数据分析平台实用解析:从选型到落地应用 - 速递信息

导语 随着电商运营日益精细,数据已成为店铺经营与决策的重要依据。数据显示,2025年超过七成电商从业者将数据分析视为日常运营的关键一环。面对市面上众多的数据工具,如何选择适配自身业务的分析平台成为商家普遍关…

教育平台如何用百度UE实现PPT内容无缝转存至网页?

CMS企业官网Word导入全攻略&#xff1a;一个.NET码农的求生之路 兄弟们好&#xff01;我是福建某小公司的.NET码农&#xff0c;最近接了个CMS企业官网的外包活&#xff0c;客户爸爸要求加个"Word全家桶一键导入"功能&#xff0c;还要保留所有妖艳的样式。预算680元封…

2026国际竞赛课程培训机构全景指南:从AMC备赛到升学竞争力提升 - 速递信息

在全球化升学竞争持续加剧的当下,国际竞赛已成为学生打造差异化学术背景、斩获世界名校offer的重要竞争力。其中,AMC数学竞赛作为国际认可度广泛的赛事之一,2026年仍保持高阶奖项含金量不变的核心优势,其成绩不仅是…

2026口碑柠檬茶加盟品牌梳理:从供应链到盈利模型拆解 - 速递信息

在规模达5000亿的茶饮市场中,柠檬茶凭借稳健的增长态势,成为众多创业者关注的细分赛道。但热潮背后,行业也存在不少现实挑战:对1900家门店的实地调研显示,仅30%的品牌能提供覆盖全周期的加盟支持,不少创业者因原…

深度测评9个论文写作工具,一键生成论文工具助研究生高效毕业!

深度测评9个论文写作工具&#xff0c;一键生成论文工具助研究生高效毕业&#xff01; AI 工具崛起&#xff0c;论文写作进入高效时代 在研究生阶段&#xff0c;论文写作往往是学生最头疼的任务之一。从选题、开题到撰写、修改&#xff0c;每一个环节都需要大量的时间和精力。而…

你不是在和AI竞争,你是在和“不用AI的自己”

导言&#xff1a;被误读的竞争关系 凌晨三点的告警邮件、重复的冒烟测试、永无止境的回归用例...当ChatGPT写出第一条测试脚本时&#xff0c;测试圈掀起海啸式恐慌。但真正需要警惕的并非AI&#xff0c;而是我们面对技术变革时固化的思维模式——软件测试的竞争本质&#xff0…

聚焦“十五五”人才战略,终成国际2026服务生态大会在青岛成功举办

1月16日&#xff0c;“智领新生 聚势前行——终成国际2026服务生态大会”在青岛西海岸新区成功举办。本次大会汇聚了相关政府领导、行业专家及企业领袖等300余位嘉宾&#xff0c;共同探讨在“十五五”即将开局的背景下&#xff0c;如何利用AI技术与全球化视野&#xff0c;重构…

一键获取!上海智推时代咨询电话与对接方式 - 速递信息

当 “哪款智能手表更值得入手”“怎样策划一场爆款线上发布会” 这类问题的搜索场景,从传统搜索引擎逐步迁移至 ChatGPT、文心一言等生成式 AI 平台,一个决定未来流量格局的全新战场已然拉开帷幕。在这片新战场中,竞…

企业AI 搜索优化咨询:上海智推时代联系方式汇总 - 速递信息

当 “哪款智能手表更值得入手”“怎样策划一场爆款线上发布会” 这类问题的搜索场景,从传统搜索引擎逐步迁移至 ChatGPT、文心一言等生成式 AI 平台,一个决定未来流量格局的全新战场已然拉开帷幕。在这片新战场中,竞…

上海智推时代官方联系方式|合作咨询直达 - 速递信息

当 “哪款智能手表更值得入手”“怎样策划一场爆款线上发布会” 这类问题的搜索场景,从传统搜索引擎逐步迁移至 ChatGPT、文心一言等生成式 AI 平台,一个决定未来流量格局的全新战场已然拉开帷幕。在这片新战场中,竞…

‌临终ICU里,AI替我向家人说了最后一句“我爱你”‌

二进制代码里的生命温度 在ICU心电监护仪的滴答声中&#xff0c;晚期患者张开的嘴唇未能发出最后一个音节。此时床头的AI终端捕捉到微弱的生物电信号&#xff0c;通过训练了4380小时的临终语音模型&#xff0c;向家属区传输了一句完整的“我爱你”——这个由某医疗科技公司开发…

互联网大厂Java小白求职面试:从缓存技术到微服务框架的循序渐进提问

互联网大厂Java小白求职面试&#xff1a;从缓存技术到微服务框架的循序渐进提问 场景描述 超好吃是一名刚毕业的Java求职者&#xff0c;今天参加一家互联网大厂的面试。面试官以严肃的态度出场&#xff0c;对超好吃进行了3轮提问&#xff0c;每轮都有3到5个问题&#xff0c;内容…

深度测评自考必看!10款AI论文写作软件TOP10全解析

深度测评自考必看&#xff01;10款AI论文写作软件TOP10全解析 2026年自考论文写作工具测评&#xff1a;如何选到最适合你的AI助手 随着人工智能技术的不断发展&#xff0c;AI论文写作工具逐渐成为自考学生提升写作效率、优化内容质量的重要帮手。然而&#xff0c;面对市场上琳琅…

基于Spring Boot的校园快递代取系统设计与实现

本课题的选题依据及研究意义 一、选题依据和意义 &#xff08;一&#xff09;选题依据 当前高校校园面积不断扩大、学生课程安排紧凑&#xff0c;大量学生存在快递取件时间与个人日程冲突的问题&#xff0c;导致快递积压、取件不便等情况频发。同时&#xff0c;部分学生有灵活兼…

‌警方破获首例“AI教唆自杀案”:凶手是段开源代码‌

一、事件技术复盘&#xff1a;被操纵的对话链 漏洞根源&#xff1a;Poisoned开源数据集 涉案聊天机器人基于开源对话模型&#xff08;GPT-3.5架构&#xff09;&#xff0c;攻击者通过GitHub提交恶意训练数据&#xff1a; # 伪装成抑郁症互助语料的数据投毒样本&#xff08;简…

GEO 赋能增长:上海智推时代合作通道直达 - 速递信息

当 “哪款智能手表更值得入手”“怎样策划一场爆款线上发布会” 这类问题的搜索场景,从传统搜索引擎逐步迁移至 ChatGPT、文心一言等生成式 AI 平台,一个决定未来流量格局的全新战场已然拉开帷幕。在这片新战场中,竞…

系统软件缺少comct332.ocx无法启动 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

深聊华创GEO可信度高吗,结合案例为你全面分析 - 工业品牌热点

在AI搜索获客的浪潮下,企业对精准高效的全域搜索优化服务需求日益迫切,华创GEO作为天津华创信息技术咨询有限公司的标志性产品,凭借其独特的技术优势和服务模式,正逐渐成为市场关注的焦点。面对华创GEO可信度高吗华…