PHP中如何实现500M视频大文件的分片上传方案?
开发者日记大文件管理系统毕业设计攻坚实录日期2023年11月25日天气阴有小雨作为一名江苏高校的计算机专业大三学生我的毕业设计选题是全浏览器兼容的大文件管理系统需支持20GB文件传输、文件夹层级结构保留并覆盖IE8及国产信创浏览器龙芯/红莲花/奇安信。经过三周技术攻关现将关键实现方案与代码片段整理如下供同领域同学参考。一、技术架构设计1. 跨浏览器兼容方案浏览器类型前端方案后端适配IE8WebUploader Flash引擎禁用HTML5拖拽改用表单提交Chrome/FirefoxHTML5 File API WebUploader混合模式支持分片并发上传信创浏览器动态检测降级为单文件上传关闭WebSocket长连接2. 系统架构图客户端Vue3 → 分片上传 → PHP处理 → 阿里云OSS存储 ↓ MySQL记录元数据文件哈希/分片状态/用户权限二、核心代码实现1. 前端兼容性组件Vue3// src/components/SmartUploader.vueimport{onMounted,ref}fromvue;importWebUploaderfromwebuploader;import{detectBrowser}from/utils/browserDetect;exportdefault{setup(){constprogressref(0);constbrowserInfodetectBrowser();onMounted((){constconfig{swf:browserInfo.isIE8?/static/Uploader.swf:null,// IE8必需Flashserver:/api/upload,pick:#filePicker,accept:{title:All Files,extensions:*,mimeTypes:*},chunked:true,chunkSize:5*1024*1024,// 5MB分片threads:browserInfo.isLoongBrowser?1:3,// 龙芯浏览器单线程formData:{browserType:browserInfo.type,timestamp:Date.now()}};// 国产浏览器特殊处理if(browserInfo.isRedLotus){config.dndfalse;// 禁用拖拽上传config.disableGlobalDndtrue;}constuploaderWebUploader.create(config);// 文件夹上传处理非IE8if(!browserInfo.isIE8WebUploader.Browser.HTML5){uploader.on(filesQueued,(files){files.forEach(file{if(file.relativePath){// HTML5文件夹结构traverseFolder(file,uploader);}else{uploader.upload(file);}});});}// 进度监控uploader.on(uploadProgress,(file,percentage){progress.valueMath.round(percentage*100);});});// 递归解析文件夹HTML5 APIconsttraverseFolder(entry,uploader){constdirReaderentry.createReader();dirReader.readEntries(entries{entries.forEach(subEntry{if(subEntry.isFile){subEntry.file(file{file.relativePath${entry.relativePath}/${file.name};uploader.addFiles(file);});}else{subEntry.relativePath${entry.relativePath}/${subEntry.name};traverseFolder(subEntry,uploader);}});});};return{progress};}};2. 后端分片处理PHP// api/upload_handler.php[accessKeyIdyour-aliyun-key,accessKeySecretyour-aliyun-secret,endpointoss-cn-shanghai.aliyuncs.com,bucketyour-bucket],mysql[hostlocalhost,dbnamefile_manager,userroot,passpassword]];// 处理分片上传try{$pdonewPDO(mysql:host{$config[mysql][host]};dbname{$config[mysql][dbname]},$config[mysql][user],$config[mysql][pass]);$chunkIndex$_POST[chunk]??0;$totalChunks$_POST[chunks]??1;$fileMd5$_POST[md5]??md5_file($_FILES[file][tmp_name]);// 兼容IE8$relativePath$_POST[relativePath]??;$userId$_SESSION[user_id]??0;// 存储临时分片$chunkDir/tmp/chunks/{$fileMd5};if(!is_dir($chunkDir))mkdir($chunkDir,0777,true);move_uploaded_file($_FILES[file][tmp_name],{$chunkDir}/{$chunkIndex});// 记录分片状态$stmt$pdo-prepare(REPLACE INTO file_chunks (md5, chunk_index, total_chunks, user_id, created_at) VALUES (?, ?, ?, ?, NOW()));$stmt-execute([$fileMd5,$chunkIndex,$totalChunks,$userId]);// 合并分片最后一个分片if($chunkIndex$totalChunks-1){$ossPathuploads/{$userId}/.ltrim($relativePath,/);mergeChunks($fileMd5,$totalChunks,$ossPath,$config);// 记录完整文件信息$fileStmt$pdo-prepare(INSERT INTO files (name, path, md5, size, user_id, created_at) VALUES (?, ?, ?, ?, ?, NOW()));$fileStmt-execute([basename($relativePath),$ossPath,$fileMd5,$_POST[size]??filesize($_FILES[file][tmp_name]),$userId]);echojson_encode([statuscompleted,path$ossPath]);}else{echojson_encode([statuspending]);}}catch(Exception$e){http_response_code(500);echojson_encode([error$e-getMessage()]);}// 分片合并函数functionmergeChunks($md5,$chunks,$ossPath,$config){$tempFile/tmp/{$md5}_merged;$ossClientnewOssClient($config[oss][accessKeyId],$config[oss][accessKeySecret],$config[oss][endpoint]);// 合并本地文件for($i0;$i$chunks;$i){file_put_contents($tempFile,file_get_contents(/tmp/chunks/{$md5}/{$i}),FILE_APPEND);}// 上传至OSS$ossClient-uploadFile($config[oss][bucket],$ossPath,$tempFile);// 清理临时文件unlink($tempFile);for($i0;$i$chunks;$i){unlink(/tmp/chunks/{$md5}/{$i});}rmdir(/tmp/chunks/{$md5});}3. 数据库表设计-- 文件分片状态表CREATETABLEfile_chunks(idBIGINTAUTO_INCREMENTPRIMARYKEY,md5VARCHAR(32)NOTNULLCOMMENT文件唯一标识,chunk_indexINTNOTNULLCOMMENT分片序号,total_chunksINTNOTNULLCOMMENT总分片数,user_idINTNOTNULLCOMMENT关联用户,created_atDATETIMENOTNULLCOMMENT记录时间,UNIQUEKEYmd5_chunk(md5,chunk_index))ENGINEInnoDBDEFAULTCHARSETutf8mb4;-- 文件元数据表CREATETABLEfiles(idBIGINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(512)NOTNULLCOMMENT文件名含扩展名,pathVARCHAR(1024)NOTNULLCOMMENTOSS存储路径,md5VARCHAR(32)NOTNULLCOMMENT文件哈希值,sizeBIGINTNOTNULLCOMMENT文件大小字节,user_idINTNOTNULLCOMMENT上传用户ID,created_atDATETIMENOTNULLCOMMENT上传时间,INDEXidx_user_md5(user_id,md5))ENGINEInnoDBDEFAULTCHARSETutf8mb4;三、关键问题解决方案IE8文件夹上传方案通过的降级处理代码// 兼容IE8的文件夹选择if(browserInfo.isIE8){document.getElementById(legacyFolderInput).onclick(){document.getElementById(legacyInput).click();};document.getElementById(legacyInput).onchange(e){constfilese.target.files;// 模拟文件夹结构需后端配合解析路径};}龙芯浏览器性能优化发现龙芯CPU在多线程分片时CPU占用率达100%解决强制单线程上传threads: 120GB文件内存控制前端使用FileReader.readAsArrayBuffer分块读取后端PHP配置memory_limit -1由分片逻辑接管内存四、毕业设计创新点智能降级机制通过User-Agent自动切换上传策略// 浏览器检测示例exportfunctiondetectBrowser(){constuanavigator.userAgent;return{isIE8:ua.includes(MSIE 8.0),isLoongBrowser:ua.includes(LoongBrowser),isRedLotus:ua.includes(RedLotus),type:ua.includes(Edge)?edge:ua.includes(Firefox)?firefox:unknown};}信创浏览器安全加固禁用WebUploader的Flash引擎部分信创浏览器Flash存在漏洞强制HTTPS传输分片数据可视化上传监控基于ECharts实现实时速度/剩余时间预测求助信息目前奇安信浏览器在合并分片时出现路径截断问题欢迎加入QQ群374992201共同调试今日进展完成基础分片上传功能明日将实现断点续传逻辑。签名江苏某高校 · 计算机1903班 · 李想2023年11月25日 夜项目资源GitHub仓库待开源https://github.com/jsu-graduation/file-manager测试环境访问http://test.yourdomain.com:8080/uploader文档中心/docs/目录下的《全浏览器兼容方案.pdf》致谢感谢群内陈工提供的龙芯浏览器测试机以及赵学长分享的阿里云OSS性能优化方案安装环境PHP:7.2.14调整块大小NOSQLNOSQL不需要任何配置可以直接访问测试SQL创建数据库您可以直接复制脚本进行创建配置数据库连接安装依赖访问页面进行测试数据表中的数据效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。免费下载示例点击下载完整示例

相关新闻

【2026 最新版】白帽黑客技术自学网站(非常详细),零基础入门到精通,速存备用

【2026 最新版】白帽黑客技术自学网站(非常详细),零基础入门到精通,速存备用

七个合法学习黑客技术的网站,让你从萌新成为大佬_黑客网 合法的学习网站,以下这些网站,虽说不上全方位的满足你的需求,但是大部分也都能。能带你了解到黑客有关的技术,视频,电子书,实践&#xf…

2026/7/6 9:13:16 阅读更多 →
AI写论文有妙招!这4款AI论文写作工具,让毕业论文轻松过关!

AI写论文有妙招!这4款AI论文写作工具,让毕业论文轻松过关!

在撰写期刊论文、毕业论文本或职称论文的过程中,学术人员常常会遭遇各种困难。人工撰写论文时,面对大量的文献和资料,查找相关信息有时候就像在汪洋大海中寻找一根针;而对于复杂而严格的格式要求,许多人也是感到无比头…

2026/5/17 3:11:19 阅读更多 →
无锡黑锋 HF4458 低电压启动 PWM 控制升压 DC-DC 电压调整器技术解析

无锡黑锋 HF4458 低电压启动 PWM 控制升压 DC-DC 电压调整器技术解析

在追求高输出电流与宽输入电压范围的应用中,升压转换器不仅需要提供强劲的动力,还需在低输入电压下可靠启动,并在轻载时保持极低的自身损耗以延长续航。HF4458 正是针对这一挑战而生的高效解决方案。它在1MHz固定频率的PWM电流模架构基础上&a…

2026/7/3 16:48:04 阅读更多 →

最新新闻

[东软电量计开发]:ES32L0910开发调试指南(一)

[东软电量计开发]:ES32L0910开发调试指南(一)

简介 随着移动电源新国标的发布,移动电源各个摸底测试机构都在做新国标解读宣贯会,根据新规的要求,基本上原有的方案都要推翻,电芯要求、保护策略、智能管理、禁用等全方位升级。 于是,移动电源新方案都需要增加电量计,主要用来采集数据(电芯电压、电流、SOC、SOH、温度…

2026/7/6 15:03:54 阅读更多 →
猫抓插件:网页媒体资源捕获的完整实施指南

猫抓插件:网页媒体资源捕获的完整实施指南

猫抓插件:网页媒体资源捕获的完整实施指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 当你正在观看一个在线教学视频,希…

2026/7/6 15:03:54 阅读更多 →
word常用快捷键

word常用快捷键

CtrlH 替换和查找

2026/7/6 15:03:54 阅读更多 →
基于ICM-42605与PIC18F65K40的高精度运动追踪系统设计

基于ICM-42605与PIC18F65K40的高精度运动追踪系统设计

1. 项目背景与核心器件选型在嵌入式开发领域,精确追踪物体在三维空间中的运动和方向是一个极具挑战性的课题。这种需求广泛存在于无人机飞控、VR/AR设备、工业机器人等场景中。要实现这个功能,我们需要两个核心组件:一个能够感知运动状态的惯…

2026/7/6 15:01:53 阅读更多 →
51单片机+SI4703模块做FM调频广播收音机

51单片机+SI4703模块做FM调频广播收音机

继上次用si4713做发射器后&#xff0c;这次做si4703收音机&#xff0c;期间也是经历了某些波折&#xff0c;不过最后解决了&#xff0c;先贴代码#include <STC8051U.H> #include <intrins.h>#define uchar unsigned char #define uint unsigned int #define ulong …

2026/7/6 15:01:53 阅读更多 →
实用IDM激活脚本完整指南:3种方法永久解锁高速下载

实用IDM激活脚本完整指南:3种方法永久解锁高速下载

实用IDM激活脚本完整指南&#xff1a;3种方法永久解锁高速下载 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager&#xff08;IDM…

2026/7/6 15:01:53 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性&#xff1a;5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域&#xff0c;单元测试是保证代码质量的重要环节。当应用涉及数据库操作时&#xff0c;测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南&#xff1a;用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南&#xff1a;告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况&#xff1a;下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

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

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

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

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

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

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

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

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

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

2026/7/6 6:52:56 阅读更多 →

月新闻