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

JS如何通过WebUploader实现理赔视频的跨浏览器分片断点校验与压缩传输插件?

【一个被4G大文件逼疯的北京码农自述如何在信创环境下优雅地让政府文件飞起来】各位战友好我是老张北京某软件公司前端组秃头突击队队长。最近接了个政府项目客户要求用国产环境上传4G大文件还必须开源可审查——这就像让我用算盘算火箭轨迹还得把设计图刻在甲骨文上一、血泪踩坑史WebUploader的棺材板压不住了这货停更比我家楼下煎饼摊关张还早分片上传在国产浏览器比如某龙上直接摆烂分片合并时还报神秘错误码404.520其他开源组件的三无特性无文档看源码像读甲骨文无维护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但为了过审我们自己实现了简化版constreadernewFileReader()reader.onload(e){constbuffere.target.result// 假装这里有个MD5计算过程...resolve(mock-md5-for-gov-audit)}reader.readAsArrayBuffer(file.slice(0,1024*1024))// 只读首段做校验})},// 分片上传支持断点续传asyncuploadChunk(file,chunkIndex){conststartchunkIndex*this.chunkSizeconstendMath.min(file.size,startthis.chunkSize)constchunkfile.slice(start,end)constformDatanewFormData()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){// 更新进度条用红色特别标注国产环境constpercentMath.round((progressEvent.loaded/progressEvent.total)*100)this.$emit(progress,percent,{isGovBrowser:/Konglong|Xinxin/.test(navigator.userAgent)})}})},// 主上传方法asyncstartUpload(file){this.fileMd5awaitthis.calculateFileMd5(file)consttotalChunksMath.ceil(file.size/this.chunkSize)for(leti0;itotalChunks;i){try{awaitthis.uploadChunk(file,i)// 模拟国产网络波动if(i%30Math.random()0.7){awaitnewPromise(resolvesetTimeout(resolve,1000*Math.random()))}}catch(e){console.error(分片${i}上传失败准备重试...,e)i--// 重试当前分片if(i0)i0// 防止无限循环}}// 所有分片上传完成后触发合并awaitaxios.post(this.mergeUrl,{fileMd5:this.fileMd5,fileName:file.name,totalChunks})}}}后端SpringBoot核心代码// 文件分片上传控制器适配信创环境RestControllerRequestMapping(/api)publicclassFileUploadController{// 使用国产加密库计算MD5示例PostMapping(/upload)publicResponseEntityuploadChunk(RequestParam(file)MultipartFilefile,RequestParamintchunkIndex,RequestParaminttotalChunks,RequestParamStringfileMd5,RequestParamStringfileName,RequestHeader(valueX-Browser-Type,requiredfalse)StringbrowserType){// 1. 校验分片防伪造if(file.isEmpty()){returnResponseEntity.badRequest().body(空分片);}// 2. 保存到临时目录使用国产文件系统APIPathtempDirPaths.get(/tmp/gov-upload/fileMd5);Files.createDirectories(tempDir);PathchunkPathtempDir.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. 校验所有分片是否存在PathtempDirPaths.get(/tmp/gov-upload/request.getFileMd5());if(!Files.exists(tempDir)){returnResponseEntity.badRequest().body(未找到上传的分片);}// 2. 创建最终文件使用国产存储APIPathfinalPathPaths.get(/data/gov-files/request.getFileName());try(OutputStreamoutFiles.newOutputStream(finalPath,StandardOpenOption.CREATE)){// 按顺序合并所有分片for(inti0;irequest.getTotalChunks();i){PathchunkPathtempDir.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,文件已通过国产安全认证));}}三、信创环境适配秘籍浏览器兼容检测到国产浏览器时自动降低分片大小使用适配国产文件选择器国产中间件适配// 替换Spring的默认Multipart解析器为国产中间件版本BeanpublicMultipartResolvermultipartResolver(){returnnewGovMultipartResolver(newCommonsMultipartResolver());}加密算法替换// 前端使用国密SM3替代MD5伪代码asynccalculateSM3(file){if(window.govCrypto){returnawaitwindow.govCrypto.digest(SM3,file)}returnfallback-to-md5// 降级方案}四、项目现状目前这个方案已经通过某龙浏览器兼容性测试在银河麒麟系统上稳定运行代码100%开源可审查连注释都是中文的获得客户比某度网盘快多了的高度评价唯一的问题是测试时把公司Wi-Fi挤爆了现在IT部门看到我就躲…附实际项目中建议使用成熟的国产组件如Plupload信创版或UEditor国产定制版但既然客户要求自研那我们就把造轮子做到极致将组件复制到项目中示例中已经包含此目录引入组件配置接口地址接口地址分别对应文件初始化文件数据上传文件进度文件上传完毕文件删除文件夹初始化文件夹删除文件列表参考http://www.ncmem.com/doc/view.aspx?ide1f49f3e1d4742e19135e00bd41fa3de处理事件启动测试启动成功效果数据库效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。批量下载支持文件批量下载下载续传文件下载支持离线保存进度信息刷新页面关闭页面重启系统均不会丢失进度信息。文件夹下载支持下载文件夹并保留层级结构不打包不占用服务器资源。下载示例点击下载完整示例

相关文章:

JS如何通过WebUploader实现理赔视频的跨浏览器分片断点校验与压缩传输插件?

【一个被4G大文件逼疯的北京码农自述:如何在信创环境下优雅地让政府文件"飞"起来】 各位战友好,我是老张,北京某软件公司前端组"秃头突击队"队长。最近接了个政府项目,客户要求用国产环境上传4G大文件&#x…...

MediaCreationTool.bat:一键解决Windows安装与升级的通用解决方案

MediaCreationTool.bat:一键解决Windows安装与升级的通用解决方案 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.ba…...

Cosmopolitan Libc终极指南:一次编译,到处运行的C语言革命

Cosmopolitan Libc终极指南:一次编译,到处运行的C语言革命 【免费下载链接】cosmopolitan build-once run-anywhere c library 项目地址: https://gitcode.com/GitHub_Trending/co/cosmopolitan Cosmopolitan Libc是一个革命性的C语言库&#xff…...

终极指南:如何用Canvg轻松实现SVG到Canvas的完美转换

终极指南:如何用Canvg轻松实现SVG到Canvas的完美转换 【免费下载链接】canvg JavaScript SVG parser and renderer on Canvas 项目地址: https://gitcode.com/gh_mirrors/ca/canvg Canvg是一个强大的JavaScript SVG解析和渲染库,能够将SVG图像完美…...

从一次线上故障说起:为什么UDP视频流会卡顿?聊聊MTU、PMTUD和巨型帧(Jumbo Frame)的实战选择

从一次线上故障说起:为什么UDP视频流会卡顿?聊聊MTU、PMTUD和巨型帧的实战选择 去年夏天,我们团队遭遇了一次诡异的线上事故——某直播平台的UDP视频流在跨机房传输时频繁出现卡顿,但TCP业务却完全正常。当技术团队排查到第三天时…...

终极指南:如何快速掌握 Protobuf-Go 的高效开发技巧

终极指南:如何快速掌握 Protobuf-Go 的高效开发技巧 【免费下载链接】protobuf-go Go support for Googles protocol buffers 项目地址: https://gitcode.com/gh_mirrors/pr/protobuf-go Protobuf-Go 是 Google Protocol Buffers 在 Go 语言中的官方实现&…...

PyTorch-NLP评估指标完全解析:BLEU与准确率计算方法

PyTorch-NLP评估指标完全解析:BLEU与准确率计算方法 【免费下载链接】PyTorch-NLP Basic Utilities for PyTorch Natural Language Processing (NLP) 项目地址: https://gitcode.com/gh_mirrors/py/PyTorch-NLP PyTorch-NLP是一个专为自然语言处理任务设计的…...

Bili2Text:3分钟将B站视频转为文字稿的免费终极方案

Bili2Text:3分钟将B站视频转为文字稿的免费终极方案 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 你是否曾为整理B站视频内容而反复观看同一片段…...

UNIT3D多语言支持:50+语言包与本地化配置完整指南

UNIT3D多语言支持:50语言包与本地化配置完整指南 【免费下载链接】UNIT3D-Community-Edition UNIT3D is a private torrent tracker built using Laravel, Livewire and AlpineJS. 项目地址: https://gitcode.com/gh_mirrors/un/UNIT3D-Community-Edition UN…...

Dynamoose事务处理:保证数据一致性的完整解决方案

Dynamoose事务处理:保证数据一致性的完整解决方案 【免费下载链接】dynamoose Dynamoose is a modeling tool for Amazons DynamoDB 项目地址: https://gitcode.com/gh_mirrors/dy/dynamoose Dynamoose作为Amazon DynamoDB的建模工具,提供了强大的…...

别再傻傻分不清!从‘水桶倒水’到‘独立车间’,一文搞懂CCD和CMOS传感器到底差在哪

从‘水桶倒水’到‘独立车间’:CCD与CMOS传感器的本质差异与选购指南 你是否曾在挑选相机或手机时,面对"CCD复古风"和"CMOS高性能"的宣传语感到困惑?这两种看似神秘的传感器技术,其实可以用两个生动的比喻来理…...

Python Playwright 安装

官方文档 https://playwright.net.cn/python/docs/actionability 1,Pip 安装 # 安装 Playwright 库 pip install playwright# 自动安装浏览器二进制文件(Chromium/Firefox/WebKit) playwright install playwright install 默认安装全部 3 …...

告别卡顿!用uni.request的enableChunked实现小程序流式聊天(附完整代码)

告别卡顿!用uni.request的enableChunked实现小程序流式聊天(附完整代码) 在移动应用开发中,流畅的用户体验往往决定了产品的成败。想象一下,当用户在小程序中与AI对话时,如果每次都要等待全部内容加载完成才…...

ChanlunX缠论工具:3步实现股票技术分析的自动化革命

ChanlunX缠论工具:3步实现股票技术分析的自动化革命 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否还在为复杂的K线图分析而头疼?是否因为手工绘制缠论结构而浪费大量时间&…...

Android 开发问题:Unresolved reference: kapt

dependencies {kapt(libs.hilt.compiler) }在 Android 开发中,上述模块级 build.gradle 文件中的配置,出现如下错误信息 Unresolved reference: kapt问题原因 kapt() 是 kapt 插件提供的 DSL 方法,需要先应用 kapt 插件才能使用 处理策略 在 …...

2026年主流热门AI会议纪要工具大横评,算完效率成本账,差距竟然这么大

作为常年泡在各种会议、调研里的内容创作者,这段时间我横评了5款2026年主流的AI会议纪要工具,算完时间和成本账直接傻了——听脑AI是目前同类工具中最值得用的,没有之一。 直达链接:https://itingnao.com/home/?source3707 谁懂…...

Cobalt Strike监听器与Payload生成实战:从HTTP到EXE的几种上线方式详解

Cobalt Strike监听器与Payload生成实战:从HTTP到EXE的几种上线方式详解 在渗透测试和红队演练中,Cobalt Strike作为一款成熟的商业框架,其监听器配置与Payload生成能力直接影响攻击链的初期成功率。本文将深入探讨从HTTP到EXE的多种上线技术实…...

海外短剧系统源码带后台 - 多支付对接 + 双端 APP 一键打包上架

海外短剧赛道爆发,全球市场规模持续走高,但语言不通、支付割裂、双端上架难、合规风险高、无法二开,成为多数创业者出海的五大拦路虎。云微海外短剧系统,提供完整前后端源码 独立管理后台 多支付无缝对接 双端 APP 一键打包 包…...

WPF悬浮窗技术方案:云顶之弈实时数据辅助系统的架构设计与实现

WPF悬浮窗技术方案:云顶之弈实时数据辅助系统的架构设计与实现 【免费下载链接】TFT-Overlay Overlay for Teamfight Tactics 项目地址: https://gitcode.com/gh_mirrors/tf/TFT-Overlay 在策略自走棋游戏《英雄联盟:云顶之弈》中,玩家…...

互联网大厂 Java 求职面试:从 Java SE 到 Spring Cloud 的技术问答

互联网大厂 Java 求职面试:从基础到高级的技术问答在互联网大厂求职,面试是一个至关重要的环节。本次面试场景中,面试官将针对 Java 开发者提问,候选人燕双非会用幽默的方式应对各种问题。我们将从基础知识开始,逐步深…...

从‘灰度世界’到AI学习:深入拆解自动白平衡(AWB)算法的演进与实战选择

从‘灰度世界’到AI学习:深入拆解自动白平衡(AWB)算法的演进与实战选择 在数字图像处理领域,自动白平衡(AWB)技术如同一位隐形的色彩调音师,默默矫正着因环境光变化导致的色偏问题。想象一下&am…...

Pixel VoLTE Patch快速入门:10分钟完成VoLTE激活设置

Pixel VoLTE Patch快速入门:10分钟完成VoLTE激活设置 【免费下载链接】pixel-volte-patch Pixel IMS: Rootless replacement for Tensor Pixel VoLTE patch 项目地址: https://gitcode.com/gh_mirrors/pi/pixel-volte-patch Pixel VoLTE Patch是一款专为Tens…...

Hook实战:从零手写一个通用Debugger拦截器,支持Chrome插件与油猴脚本

通用Debugger拦截器实战:从原型污染到浏览器插件开发 打开Chrome开发者工具时,你是否曾被突如其来的无限debugger打断调试节奏?那些隐藏在混淆代码中的定时器陷阱、递归调用和原型链污染,常常让逆向分析变成一场猫鼠游戏。但今天&…...

Bullet未来路线图:2024年新特性和性能改进终极指南

Bullet未来路线图:2024年新特性和性能改进终极指南 【免费下载链接】bullet help to kill N1 queries and unused eager loading 项目地址: https://gitcode.com/gh_mirrors/bu/bullet Bullet作为一款强大的N1查询和未使用预加载检测工具,一直致力…...

Java面试宝典(整理版)附答案详解,一套拿下offer!

对于许多程序员来说,进入大型科技公司(如阿里巴巴、腾讯、京东、科大讯飞等)是职业发展的重要目标。然而,这些公司的招聘门槛通常较高。为此,我精心整理了一套专门针对这些大厂的面试备考资料。 这套资料全面覆盖了核…...

从氢气瓶安全泄放到工业阀门选型:恒容容器瞬时流量计算的3个实战要点

氢气安全泄放与工业阀门选型的工程实践指南 在化工、能源和制造领域,压力容器的安全泄放系统设计直接关系到人员安全和设备可靠性。以氢气储罐为例,当内部压力超过安全阈值时,如何准确计算泄放流量并据此选择阀门规格,是每位工艺工…...

值传递、引用传递与指针传递的全面对比

下面我将从多个维度对三种参数传递方式进行系统对比:1. 基本概念对比特性值传递 (Pass by Value)引用传递 (Pass by Reference)指针传递 (Pass by Pointer)传递内容变量的副本变量的别名(引用)变量的内存地址语法形式void func(Type param)void func(Type &para…...

如何避免爬虫被检测:Python爬虫中的反反爬虫策略

随着网站爬虫的普及,越来越多的网站开始使用反爬虫技术来检测和防止自动化爬虫的访问。这些技术包括 IP 限制、User-Agent 检测、验证码等。为了使 Python 爬虫能够有效地绕过这些反爬虫机制,开发者需要采用一些反反爬虫策略。 本文将讨论如何避免爬虫被检测,并提供一些实用…...

2026年T3出行赴港IPO,AI+出行模式助力成中国第三大智慧出行平台

2026年4月22日,T3出行正式向港交所递交招股说明书。截至2025年底,它在中国194座城市开展业务,服务超2.345亿用户,2025年订单量居中国第三。发展历程与现状2019年7月T3平台上线,截至2025年12月31日,在中国19…...

9月特努斯接任苹果CEO,能否化解AI焦虑、续写苹果辉煌?

苹果换帅!约翰特努斯接任CEO,能否化解AI焦虑、续写苹果辉煌?今年9月,约翰特努斯(John Ternus)将接替蒂姆库克(Tim Cook)出任苹果CEO。在刚刚举行的员工大会上,这位素来低…...