news 2026/5/1 8:27:44

PHP如何优化视频大文件的断点续传切片处理分享?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP如何优化视频大文件的断点续传切片处理分享?

【一个大三生的悲喜大文件上传血泪史】

(敲黑板)各位看官且听我道来,这毕业设计简直比追女神还难!导师说要搞个能上传10G文件的系统,还要支持IE8这种上古神器,更要命的是必须用原生JS实现(Vue3?那是啥?能吃吗?)。


前端篇:与WebUploader的相爱相杀

// 经过三天三夜与IE8的搏斗,终于搞出这个兼容性拉满的uploader.jsfunctionCompatibleUploader(){this.chunks=[];this.chunkSize=5*1024*1024;// 5MB分片this.fileMd5='';// 检测浏览器类型(IE8特供版)this.isIE8=function(){return!!window.ActiveXObject&&!document.addEventListener;};// 计算文件MD5(IE8哭晕在厕所)this.calculateMD5=function(file,callback){if(this.isIE8()){// IE8的降级方案:用文件名+大小当伪MD5callback(file.name+'_'+file.size);return;}// 现代浏览器用crypto APIconstreader=newFileReader();reader.onload=(e)=>{constarr=newUint8Array(e.target.result);lethash=0;for(leti=0;i<arr.length;i++){hash=((hash<<5)-hash)+arr[i];hash|=0;}callback('ie8_'+Math.abs(hash).toString(16));};reader.readAsArrayBuffer(file.slice(0,1024*1024));// 只读前1MB};// 分片上传(IE8兼容版)this.uploadChunk=function(file,chunkIndex,totalChunks){conststart=chunkIndex*this.chunkSize;constend=Math.min(file.size,start+this.chunkSize);constblob=file.slice(start,end);constformData=newFormData();formData.append('file',blob);formData.append('chunkIndex',chunkIndex);formData.append('totalChunks',totalChunks);formData.append('md5',this.fileMd5);constxhr=newXMLHttpRequest();xhr.open('POST','/api/upload',true);xhr.onreadystatechange=function(){if(xhr.readyState===4){if(xhr.status===200){// 保存进度到localStorage(IE8用userData替代)constprogressKey='upload_progress_'+this.fileMd5;constprogressData={chunkIndex:chunkIndex,totalChunks:totalChunks};if(this.isIE8()){// IE8的降级存储方案(实际项目请用cookie或flash)document.cookie=progressKey+'='+encodeURIComponent(JSON.stringify(progressData))+'; expires=Fri, 31 Dec 9999 23:59:59 GMT';}else{localStorage.setItem(progressKey,JSON.stringify(progressData));}}}}.bind(this);xhr.send(formData);};}

后端篇:PHP与OSS的虐恋

// upload.php - 这个文件让我掉了好多头发header('Content-Type: application/json');// 配置信息(实际项目请用.env)$ossConfig=['accessKeyId'=>'your_access_key','accessKeySecret'=>'your_secret_key','endpoint'=>'oss-cn-hangzhou.aliyuncs.com','bucket'=>'your-bucket'];// 初始化OSS客户端(简化版)functioninitOssClient($config){// 实际项目请用官方SDK// 这里用伪代码表示(IE8兼容的PHP5.2写法)return(object)['putObject'=>function($bucket,$object,$file)use($config){// 模拟OSS上传(实际要调用阿里云SDK)file_put_contents("/tmp/oss_simulator/$object",file_get_contents($file));returntrue;}];}// 处理分片上传$chunkIndex=$_POST['chunkIndex']??0;$totalChunks=$_POST['totalChunks']??1;$md5=$_POST['md5']??'';$tempDir="/tmp/uploads/$md5";// 创建临时目录if(!file_exists($tempDir)){mkdir($tempDir,0777,true);}// 保存分片$chunkPath="$tempDir/chunk_$chunkIndex";move_uploaded_file($_FILES['file']['tmp_name'],$chunkPath);// 如果是最后一个分片,合并文件if($chunkIndex==$totalChunks-1){$finalPath="$tempDir/final_file";$ossObject="uploads/".uniqid().'_'.basename($_FILES['file']['name']);// 合并分片(IE8兼容的合并方式)$fp=fopen($finalPath,'wb');for($i=0;$i<$totalChunks;$i++){$chunkContent=file_get_contents("$tempDir/chunk_$i");fwrite($fp,$chunkContent);}fclose($fp);// 上传到OSS$ossClient=initOssClient($ossConfig);if($ossClient->putObject($ossConfig['bucket'],$ossObject,$finalPath)){// 清理临时文件array_map('unlink',glob("$tempDir/*"));rmdir($tempDir);echojson_encode(['success'=>true,'ossUrl'=>$ossObject]);}else{echojson_encode(['success'=>false,'error'=>'OSS上传失败']);}exit;}echojson_encode(['success'=>true]);

血泪经验总结:

  1. IE8兼容性

    • ActiveXObject替代现代API
    • 降级方案:文件名+大小当伪MD5
    • 存储用cookie替代localStorage
  2. 断点续传

    • 前端用localStorage/cookie保存进度
    • 后端用临时目录存储已上传分片
    • 合并时检查分片完整性
  3. 文件夹上传

    • 前端递归读取文件夹内容
    • 后端维护目录结构映射表
    • 用JSON保存层级关系(示例):
    {"name":"root","type":"dir","children":[{"name":"subfolder","type":"dir","children":[...]},{"name":"file.txt","type":"file","md5":"abc123"}]}
  4. 加密传输

    • 前端用CryptoJS加密(IE8用自定义算法)
    • 后端解密后处理
    • 示例加密函数:
    // IE8兼容的简单加密functionsimpleEncrypt(str){if(isIE8()){returnstr.split('').reverse().join('');// 反序当加密}// 现代浏览器用CryptoJSreturnCryptoJS.AES.encrypt(str,'secret_key').toString();}

求职彩蛋:

正在疯狂投递简历中,求各位大佬内推!擅长:

  • 挖漏洞(自己系统的那种)
  • 写兼容IE8的代码(头发还在)
  • 和产品经理打架(物理)

QQ群:374992201(进群抢红包,推荐项目拿提成,说不定还能找到工作!)

(PS:导师说这个系统要是能跑起来,直接给优秀毕业设计,兄弟们靠你们了!)

安装环境

PHP:7.2.14

调整块大小

NOSQL

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

SQL

创建数据库

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

配置数据库连接

安装依赖

访问页面进行测试

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

免费下载示例

点击下载完整示例

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

PHP在国企项目中如何处理视频大附件的切片分享?

老哥的大文件上传历险记 各位同行兄弟好啊&#xff01;我是辽宁的一名"资深"(其实就是年纪大了) Java 程序员&#xff0c;最近接了个外包项目&#xff0c;要求可真是把我这老腰给闪了&#xff01; 需求分析&#xff1a;这活儿比东北虎还猛 客户要的文件上传功能&a…

作者头像 李华
网站建设 2026/5/1 5:43:48

前端开发者如何用百度富文本编辑器处理EXCEL数据?

CMS企业官网Word内容导入功能开发记录 需求分析 作为浙江的一名.NET程序员&#xff0c;我最近接手的CMS企业官网项目需要增强文章发布模块的编辑器功能。客户提出以下核心需求&#xff1a; 内容导入功能&#xff1a; 支持Word/Excel/PPT/PDF文档导入并保留样式支持Word一键粘…

作者头像 李华
网站建设 2026/5/1 7:31:59

央企应用中PHP如何实现视频大文件的分片上传分享?

大文件上传功能开发纪实&#xff1a;我与2G文件的恩怨情仇 客户需求分析 昨天接了个"看似简单实则要命"的外包项目&#xff0c;客户甩来的需求清单让我差点把咖啡喷到屏幕上&#xff1a; 支持2G文件批量上传 &#x1f631;兼容IE11到Chrome最新版 &#x1f92f;要…

作者头像 李华
网站建设 2026/4/21 23:26:42

基于SOE算法的多时段随机配电网重构:MATLAB代码探索

MATLAB代码&#xff1a;基于SOE算法的多时段随机配电网重构方法 关键词&#xff1a;配电网重构 SOE算法 多时段随机重构 参考文档&#xff1a;《Switch Opening and Exchange Method for Stochastic Distribution Network Reconfiguration》完全复现 仿真平台&#xff1a;MA…

作者头像 李华
网站建设 2026/5/1 6:54:51

生成式AI偏见检测工具TOP5:软件测试从业者的专业指南

一、生成式AI偏见的背景与挑战 生成式AI&#xff08;如大型语言模型&#xff09;在软件测试领域的应用日益广泛&#xff0c;但模型训练和输出中潜藏的偏见问题可能引发公平性风险&#xff0c;例如在自动化测试脚本生成或用户界面验证中产生歧视性结果。偏见主要包括识别偏差、…

作者头像 李华
网站建设 2026/5/1 7:47:18

69 禁用SimpleAsyncTaskExecutor

禁用SimpleAsyncTaskExecutor 本文深入剖析SimpleAsyncTaskExecutor的致命缺陷,揭示无限创建线程导致的内存泄漏问题,掌握AsyncConfigurer接口实现和生产环境线程池配置最佳实践。 1 SimpleAsyncTaskExecutor的致命缺陷 为什么不能使用SimpleAsyncTaskExecutor? 在Spring异步…

作者头像 李华