百度开源上传组件在局域网如何处理大文件断点续传?
大文件上传方案探索从WebUploader到自定义分片上传的实践作为一名前端开发工程师最近遇到了一个颇具挑战性的需求需要在Vue项目中实现4GB左右大文件的稳定上传且要兼容Chrome、Firefox、Edge等主流浏览器后端使用PHP接收。此前我们采用了百度开源的WebUploader组件但在实际使用中遇到了几个难以解决的问题分片上传过程中偶尔会出现断点续传失效的情况对新版浏览器的兼容性不够理想缺乏官方技术支持社区活跃度下降自定义UI的灵活性不足方案选型思考经过技术调研我评估了以下几个主流方案Plupload功能全面但文档不够友好对Vue集成支持一般Uppy现代感强但体积较大学习曲线较陡Resumable.js专注分片上传但UI较为基础自定义实现基于XMLHttpRequest/Fetch API实现核心分片逻辑最终决定采用自定义分片上传方案主要基于以下考虑完全控制上传流程可以针对业务需求深度优化减少第三方依赖降低维护成本与Vue生态无缝集成核心实现思路1. 前端分片策略// 文件分片工具函数constchunkFile(file,chunkSize5*1024*1024){constchunks[]letcurrent0while(currentfile.size){chunks.push({file:file.slice(current,currentchunkSize),chunkIndex:chunks.length,totalChunks:Math.ceil(file.size/chunkSize),fileName:file.name,fileSize:file.size,fileType:file.type,fileLastModified:file.lastModified,identifier:generateFileIdentifier(file)// 生成唯一标识用于断点续传})currentchunkSize}returnchunks}// 生成文件唯一标识基于文件内容constgenerateFileIdentifier(file){returnnewPromise((resolve){constreadernewFileReader()reader.onload(e){constarrnewUint8Array(e.target.result)consthashArrayArray.from(arr).map(bb.toString(16).padStart(2,0))resolve(hashArray.join().substring(0,16))}reader.readAsArrayBuffer(file.slice(0,1024*1024))// 取前1MB计算哈希})}2. Vue组件实现export default { data() { return { file: null, chunks: [], uploadStatus: idle, // idle, uploading, paused, completed, error progress: 0, error: null, currentChunk: 0, abortController: null } }, methods: { async handleFileChange(e) { this.file e.target.files[0] if (!this.file) return // 生成文件标识简化版实际项目应使用更可靠的算法 const identifier await this.generateSimpleIdentifier(this.file) // 检查服务器是否有未完成的上传记录 const res await this.checkUploadStatus(identifier) if (res.exists) { if (confirm(检测到未完成的上传是否继续)) { this.currentChunk res.uploadedChunks } else { // 清除服务器记录实际项目应实现 } } this.chunks this.chunkFile(this.file) this.progress Math.round((this.currentChunk / this.chunks.length) * 100) }, async startUpload() { if (!this.file) return this.uploadStatus uploading this.error null this.abortController new AbortController() try { for (let i this.currentChunk; i this.chunks.length; i) { if (this.uploadStatus ! uploading) break // 处理暂停情况 const chunk this.chunks[i] const formData new FormData() formData.append(file, chunk.file) formData.append(chunkIndex, chunk.chunkIndex) formData.append(totalChunks, chunk.totalChunks) formData.append(fileName, chunk.fileName) formData.append(fileSize, chunk.fileSize) formData.append(fileType, chunk.fileType) formData.append(identifier, chunk.identifier) await this.uploadChunk(formData) this.currentChunk i 1 this.progress Math.round(((i 1) / this.chunks.length) * 100) } if (this.uploadStatus uploading) { await this.mergeChunks(this.chunks[0].identifier, this.chunks[0].fileName) this.uploadStatus completed this.$emit(upload-complete) } } catch (err) { console.error(上传失败:, err) this.error err.message || 上传过程中出现错误 this.uploadStatus error } }, async uploadChunk(formData) { return fetch(/api/upload-chunk.php, { method: POST, body: formData, signal: this.abortController.signal }) }, async mergeChunks(identifier, fileName) { return fetch(/api/merge-chunks.php, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ identifier, fileName }) }) }, // 简化版标识生成实际项目应使用更可靠的算法 generateSimpleIdentifier(file) { return ${file.name}-${file.size}-${file.lastModified} }, async checkUploadStatus(identifier) { // 实际项目应实现与后端的交互 return { exists: false, uploadedChunks: 0 } }, pauseUpload() { if (this.uploadStatus uploading) { this.abortController.abort() this.uploadStatus paused } }, resumeUpload() { if (this.uploadStatus paused) { this.startUpload() } } } }3. PHP后端实现要点$chunkIndex,totalChunks$totalChunks,fileName$fileName,uploadedtime()]));echojson_encode([statussuccess]);}else{http_response_code(500);echojson_encode([statuserror,messageFailed to save chunk]);}// merge-chunks.php - 合并分片header(Content-Type: application/json);$uploadDir/path/to/upload/dir/;$tempDir$uploadDir.temp/;$datajson_decode(file_get_contents(php://input),true);$identifier$data[identifier]??;$fileName$data[fileName]??;// 检查标识符和文件名if(empty($identifier)||empty($fileName)){http_response_code(400);echojson_encode([statuserror,messageInvalid parameters]);exit;}// 检查上传状态文件$statusFile$tempDir.$identifier..upload;if(!file_exists($statusFile)){http_response_code(404);echojson_encode([statuserror,messageUpload not found]);exit;}$statusjson_decode(file_get_contents($statusFile),true);$totalChunks$status[totalChunks]??0;// 合并文件$finalPath$uploadDir.$fileName;if($fpfopen($finalPath,wb)){for($i0;$i$totalChunks;$i){$chunkPath$tempDir.$identifier._.$i;if(!file_exists($chunkPath)){fclose($fp);unlink($finalPath);// 删除已创建的部分文件http_response_code(400);echojson_encode([statuserror,messageMissing chunk .$i]);exit;}$contentfile_get_contents($chunkPath);fwrite($fp,$content);unlink($chunkPath);// 删除已合并的分片}fclose($fp);// 删除状态文件unlink($statusFile);echojson_encode([statussuccess,path$finalPath]);}else{http_response_code(500);echojson_encode([statuserror,messageFailed to create final file]);}?方案优势与改进点优势完全可控从分片策略到上传逻辑完全自主实现深度优化可以根据网络状况动态调整分片大小良好兼容基于标准Web API实现兼容所有现代浏览器断点续传通过文件标识实现可靠的断点续传进度可视化精确计算上传进度可改进方向并发上传当前实现是顺序上传可优化为并发上传提高速度文件校验增加MD5/SHA校验确保文件完整性更可靠的标识生成当前简化版标识可能存在冲突风险服务端清理实现自动清理未完成上传的临时文件拖拽上传增强用户体验支持拖放文件上传实施建议渐进式实现先实现基本分片上传再逐步添加断点续传、并发上传等功能充分测试在不同网络环境和浏览器下进行全面测试监控上报添加上传失败监控和错误上报机制性能优化根据实际测试结果调整分片大小和并发数通过这种自定义实现方式我们成功解决了WebUploader带来的各种问题同时获得了更好的性能和更灵活的控制能力。目前该方案已在我们项目中稳定运行数月处理了数百个4GB文件的上传未出现重大故障。将组件复制到项目中示例中已经包含此目录引入组件配置接口地址接口地址分别对应文件初始化文件数据上传文件进度文件上传完毕文件删除文件夹初始化文件夹删除文件列表参考http://www.ncmem.com/doc/view.aspx?ide1f49f3e1d4742e19135e00bd41fa3de处理事件启动测试启动成功效果数据库效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。批量下载支持文件批量下载下载续传文件下载支持离线保存进度信息刷新页面关闭页面重启系统均不会丢失进度信息。文件夹下载支持下载文件夹并保留层级结构不打包不占用服务器资源。下载示例点击下载完整示例

相关新闻

干货!覆盖网络安全领域的 12 个程序员证书,含金量拉满:从零基础到精通,收藏够用!

干货!覆盖网络安全领域的 12 个程序员证书,含金量拉满:从零基础到精通,收藏够用!

近来IT行业成为了发展前景好高薪资的大热门,越来越多的人选择参加各种各样的计算机考试,就是为了拿含金量高的证书,提升自己的职场竞争力。 那么程序员有哪些含金量高的证书可以考?下面小编将详细介绍一下含金量高的IT证书&#x…

2026/7/4 11:14:52 阅读更多 →
Windows系统msvcp90.dll丢失 打不开程序 免费下载方法分享

Windows系统msvcp90.dll丢失 打不开程序 免费下载方法分享

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

2026/7/3 15:45:22 阅读更多 →
Windows系统找不到msvcp80.dll文件 打不开程序 免费下载方法分享

Windows系统找不到msvcp80.dll文件 打不开程序 免费下载方法分享

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

2026/7/4 17:17:26 阅读更多 →

最新新闻

ICM-42688-P与STM32F746ZG在工业自动化中的应用

ICM-42688-P与STM32F746ZG在工业自动化中的应用

1. ICM-42688-P与STM32F746ZG的黄金组合解析 在工业自动化和机器人控制领域,传感器与微控制器的协同设计直接决定了系统的性能上限。ICM-42688-P作为TDK InvenSense推出的6轴MEMS运动传感器,与STMicroelectronics的STM32F746ZG Cortex-M7微控制器形成的硬…

2026/7/5 12:47:54 阅读更多 →
混合整数二次规划在模型预测控制中的应用与求解器对比

混合整数二次规划在模型预测控制中的应用与求解器对比

1. 混合整数二次规划在模型预测控制中的核心作用 混合整数二次规划(MIQP)作为模型预测控制(MPC)中处理离散决策变量的关键技术,其核心价值在于平衡计算复杂度和控制性能。在车辆动力系统控制这类典型应用中,变速箱档位选择、发动机启停等离散决策变量与连…

2026/7/5 12:47:54 阅读更多 →
YOLO实战避坑指南:从环境配置到部署落地的完整工程化流程

YOLO实战避坑指南:从环境配置到部署落地的完整工程化流程

如果你在 2024 年或 2025 年才开始接触 YOLO,可能会觉得它已经是一个“古老”且“成熟”的技术栈,网上教程遍地都是,随便找个代码跑起来似乎并不难。但当你真正想把它用起来,无论是做一个毕业设计、一个内部工具,还是想…

2026/7/5 12:45:54 阅读更多 →
RT-DETR实战:从原理到部署,掌握实时目标检测新范式

RT-DETR实战:从原理到部署,掌握实时目标检测新范式

如果你正在为毕业设计、学术论文或者项目选型而纠结,面对目标检测领域两大主流技术路线——YOLO系列和DETR系列——不知道该如何选择,那么这篇文章就是为你准备的。这不仅仅是“YOLO vs DETR”的简单对比,更是一个关于技术范式、工程实践和未…

2026/7/5 12:45:54 阅读更多 →
YOLOv8保姆级教程:一小时搞定环境搭建、自定义数据集训练与部署

YOLOv8保姆级教程:一小时搞定环境搭建、自定义数据集训练与部署

很多同学在入门深度学习目标检测时,面对YOLOv8的部署和训练常常感到无从下手,网上教程要么版本过时,要么步骤跳跃,导致环境配置失败、训练报错不断。本文将为你提供一份从零开始的保姆级教程,手把手带你在一小时内完成…

2026/7/5 12:43:53 阅读更多 →
暗黑2存档编辑器:可视化修改神器,让游戏存档管理变得如此简单

暗黑2存档编辑器:可视化修改神器,让游戏存档管理变得如此简单

暗黑2存档编辑器:可视化修改神器,让游戏存档管理变得如此简单 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾经因为《暗黑破坏神2》中角色属性点分配不当而懊恼?是否想要测试不同的装…

2026/7/5 12:43:53 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻