news 2026/6/10 1:04:42

使用PHP进行跨平台视频大文件分片上传分享?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用PHP进行跨平台视频大文件分片上传分享?

开发者日记 - 大文件传输系统开发实录
日期:2023年11月15日
天气:阴

项目背景与需求梳理

作为江苏的一名独立开发者,近期承接了一个企业级文件传输系统项目,核心需求如下:

  1. 大文件支持:单文件20GB,需兼容文件夹上传(保留层级结构)。
  2. 断点续传:跨会话、跨设备(重启电脑后仍可恢复)。
  3. 全平台兼容:Windows/macOS/Linux,浏览器覆盖IE8到Chrome/Firefox/Safari等。
  4. 技术栈
    • 前端:Vue3 + WebUploader(或H5 API)
    • 后端:PHP + MySQL(记录分片信息)
    • 存储:华为云OBS(对象存储)
  5. 特殊要求:免费开源代码、7×24小时技术支持(通过QQ群374992201)。

技术选型与挑战

1. 上传组件选择
  • WebUploader:兼容IE8+,支持分片、断点续传,但需手动封装文件夹解析逻辑。
  • H5 File API:现代浏览器支持良好,但IE8/9需Polyfill,且文件夹上传需依赖webkitdirectory(非标准)。
    决策:以WebUploader为主,H5作为降级方案,通过User-Agent判断浏览器类型动态切换。
2. 断点续传设计
  • 分片存储:将大文件切分为5MB分片,上传时记录已完成的分片序号。
  • 进度持久化
    • 前端:使用localStorageIndexedDB存储临时进度(跨会话)。
    • 后端:MySQL表记录文件唯一标识(MD5)、总分片数、已上传分片列表。
  • 跨设备恢复:通过文件MD5校验匹配历史记录,从华为云OBS合并已上传分片。
3. 文件夹上传实现
  • WebUploader扩展:监听directory事件,递归解析文件夹结构,生成扁平化的文件路径列表(如/parent/child/file.txt)。
  • 后端处理:接收路径信息,在华为云OBS中按原路径创建空文件夹(通过putObject设置Content-Type: application/directory)。

核心代码实现

前端(Vue3 + WebUploader)
// src/components/Uploader.vueimportWebUploaderfrom'webuploader';import'webuploader/dist/webuploader.css';exportdefault{mounted(){constuploader=WebUploader.create({swf:'/path/to/webuploader.swf',// IE8/9兼容server:'/api/upload',chunked:true,chunkSize:5*1024*1024,// 5MB分片formData:{fileMd5:'',// 通过后端接口预先计算isDir:false// 标记是否为文件夹},files:[]// 存储文件夹结构});// 监听文件夹选择(仅现代浏览器)document.getElementById('filePicker').addEventListener('change',(e)=>{constfiles=e.target.files;if(files.length&&files[0].webkitRelativePath){// 递归解析文件夹constparseDir=(file,path='')=>{constfullPath=path+file.name;if(file.isDirectory){// 模拟文件夹上传(实际需后端支持)return;}uploader.addFiles({name:file.name,relativePath:fullPath,size:file.size,type:file.type});};Array.from(files).forEach(file=>parseDir(file));}});// 断点续传:从localStorage加载进度constresumeData=localStorage.getItem('upload_progress');if(resumeData){const{fileMd5,chunks}=JSON.parse(resumeData);uploader.option('formData',{fileMd5,isDir:false});// 跳过已上传的分片(需后端配合校验)}// 上传完成合并分片uploader.on('uploadSuccess',(file,response)=>{if(response.needMerge){fetch('/api/merge',{method:'POST',body:JSON.stringify({fileMd5:response.fileMd5})});}});}};
后端(PHP + MySQL)
// api/upload.phpprepare("INSERT INTO upload_chunks (file_md5, chunk_index, uploaded_at) VALUES (?, ?, NOW()) ON DUPLICATE KEY UPDATE updated_at = NOW()");$stmt->execute([$fileMd5,$chunkIndex]);// 上传分片到华为云OBS$obsClient=new\OBS\ObsClient(['key'=>'your-access-key','secret'=>'your-secret-key','endpoint'=>'obs.cn-east-3.myhuaweicloud.com']);$obsPath="uploads/{$fileMd5}/chunk_{$chunkIndex}";$obsClient->putObject(['Bucket'=>'your-bucket','Key'=>$obsPath,'SourceFile'=>$_FILES['file']['tmp_name']]);// 检查是否所有分片已上传$chunksCount=$pdo->query("SELECT COUNT(*) FROM upload_chunks WHERE file_md5 = '{$fileMd5}'")->fetchColumn();$totalChunks=$_POST['totalChunks'];// 前端传递总分片数if($chunksCount===$totalChunks){echojson_encode(['needMerge'=>true,'fileMd5'=>$fileMd5]);}else{echojson_encode(['success'=>true]);}?>
MySQL表结构
CREATETABLEupload_chunks(idINTAUTO_INCREMENTPRIMARYKEY,file_md5VARCHAR(32)NOTNULL,chunk_indexINTNOTNULL,uploaded_atDATETIMEDEFAULTCURRENT_TIMESTAMP,UNIQUEKEY(file_md5,chunk_index));

测试与优化

  1. 兼容性测试
    • IE8:需引入es5-shimjson2.js
    • 文件夹上传:在Chrome中测试webkitRelativePath,IE使用ActiveX模拟(需用户授权)。
  2. 性能优化
    • 分片并发上传(WebUploader默认支持3个并发)。
    • 华为云OBS启用CDN加速下载。
  3. 断点续传验证
    • 手动终止进程后,重启上传时跳过已完成的分片。

后续计划

  1. 完善QQ群技术支持文档,提供常见问题解答(FAQ)。
  2. 开源代码至GitHub,附详细部署说明。
  3. 考虑增加WebSocket实时进度通知功能。

今日总结:核心功能已跑通,但IE兼容性和文件夹解析仍需打磨。欢迎大神加入QQ群交流优化方案!


(日记结束)

:实际项目中需补充安全校验(如文件类型白名单、分片签名防篡改),代码仅为示例框架,需根据业务需求调整。

安装环境

PHP:7.2.14

调整块大小

NOSQL

NOSQL不需要任何配置,可以直接访问测试

SQL

创建数据库

您可以直接复制脚本进行创建

配置数据库连接

安装依赖

访问页面进行测试

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

免费下载示例

点击下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 15:58:43

不踩雷AI论文软件 千笔ai写作 VS Checkjie,研究生写论文更省心!

随着人工智能技术的迅猛发展,AI辅助写作工具已经逐渐成为高校学术写作中不可或缺的助手,尤其在研究生群体中,越来越多的学生开始借助这些工具来提升论文写作效率、优化内容结构。然而,面对市场上琳琅满目的AI写作软件,…

作者头像 李华
网站建设 2026/6/8 20:33:51

互联网大厂Java面试:严肃面试官与搞笑程序员的对决111

场景: 在某互联网大厂的面试室,一位严肃的面试官正准备提问,而对面坐着一位看似紧张却又想显得轻松的程序员小张。 面试官:我们先来聊聊Java核心知识。第一个问题,Java中的JVM是如何管理内存的? 程序员小张…

作者头像 李华
网站建设 2026/6/8 14:51:47

航空航天领域如何实现大文件秒传的解决方案总结?

最近做在做ePartner项目,涉及到文件上传的问题。 以前也做过文件上传,但都是些小文件,不超过2M。 这次要求上传100M以上的东西。 没办法找来资料研究了一下。基于WEB的文件上传可以使用FTP和HTTP两种协议,用FTP的话虽然传输稳定&a…

作者头像 李华
网站建设 2026/6/6 13:41:31

医院电子病历TinyMCE粘贴Word批注内容出现乱码怎么修复?

CMS企业官网编辑器扩展开发记录 需求分析与技术评估 作为上海的一名PHP全栈开发者,我最近接手了一个CMS企业官网的外包项目。客户提出了一项新需求:在TinyMCE 5编辑器中增加Office文档导入和一键粘贴功能。 核心需求点: 支持Word/Excel/P…

作者头像 李华