news 2026/10/15 15:44:12

PHP在信创环境下如何处理视频大文件的切片分享?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP在信创环境下如何处理视频大文件的切片分享?

一个苦逼信息安全专业学生的毕业设计求助

大家好,我是广西某高校信息安全专业的大三狗,眼瞅着就要毕业了,现在正被一个文件管理系统的毕业设计折磨得死去活来…

我的困境

最近遇到了一个"大"问题 - 不是大姨妈,是大文件上传!要求支持10G左右的文件传输,还要加密传输和存储,带断点续传,断点续传还得支持离线保存进度(关机重启都不丢那种)。文件夹上传还得保持层级结构,最好还能加密。

最可怕的是,要求支持IE8和国产浏览器!学校的老古董电脑还在用Windows 7+IE9…这年头还有人用IE8吗?我连IE11都想卸载!

技术栈

后端:PHP (Zend Studio)
前端:Vue3 CLI (原生JS实现)
数据库:MySQL
服务器:阿里云ECS (目前在本地CentOS虚拟机测试)
存储:阿里云OSS (私有云/公有云/混合云)

网上找代码的血泪史

网上的代码要么只有上传功能,要么文件夹上传残缺不全,都是片段代码根本不能用!最气人的是出了问题找不到人 - 这些开发者连个群都不建,更别提留联系方式了。我真的是服了!

求助各位大佬

有没有好心的大佬能免费指导我一下?最好能帮我把代码写好调试好,这样毕业答辩时我就能直接演示了!感恩戴德!

欢迎加入QQ群交流:374992201

最近群里做活动:

  • 新人加群送1~99元红包 (真的假的?)
  • 推荐项目有提成 (一个项目2万提1万,10个项目10万?这比打工强多了!)

PS:有没有师兄师姐能介绍工作啊?马上要毕业了,求推荐好工作!


代码实现方案

前端实现 (Vue3 + 原生JS)

// 文件切片上传核心逻辑classBigFileUploader{constructor(options){this.file=options.file;this.chunkSize=options.chunkSize||5*1024*1024;// 默认5MBthis.totalChunks=Math.ceil(this.file.size/this.chunkSize);this.currentChunk=0;this.uploadedChunks=this.loadProgress()||[];this.encryptKey=options.encryptKey;}// 从本地存储加载上传进度loadProgress(){constprogress=localStorage.getItem(`upload_${this.file.name}_progress`);returnprogress?JSON.parse(progress):[];}// 保存上传进度到本地存储saveProgress(){localStorage.setItem(`upload_${this.file.name}_progress`,JSON.stringify(this.uploadedChunks));}// 加密切片asyncencryptChunk(chunk){if(!this.encryptKey)returnchunk;// 这里使用Web Crypto API进行加密// 实际项目中应该使用更安全的加密方案constencoder=newTextEncoder();constkeyMaterial=awaitwindow.crypto.subtle.importKey('raw',encoder.encode(this.encryptKey),{name:'AES-GCM'},false,['encrypt']);constiv=window.crypto.getRandomValues(newUint8Array(12));constencrypted=awaitwindow.crypto.subtle.encrypt({name:'AES-GCM',iv:iv},keyMaterial,chunk);return{iv,encrypted};}// 上传单个切片asyncuploadChunk(chunkIndex){conststart=chunkIndex*this.chunkSize;constend=Math.min(start+this.chunkSize,this.file.size);constchunk=this.file.slice(start,end);// 加密切片constencrypted=awaitthis.encryptChunk(chunk);constformData=newFormData();formData.append('file',newBlob([encrypted.encrypted]));formData.append('chunkIndex',chunkIndex);formData.append('totalChunks',this.totalChunks);formData.append('fileName',this.file.name);formData.append('fileSize',this.file.size);formData.append('iv',encrypted.iv);try{constresponse=awaitfetch('/upload.php',{method:'POST',body:formData});if(response.ok){this.uploadedChunks.push(chunkIndex);this.saveProgress();returntrue;}returnfalse;}catch(error){console.error('上传失败:',error);returnfalse;}}// 开始上传asyncstartUpload(){// 先检查哪些切片已经上传过constchunksToUpload=[];for(leti=0;i<this.totalChunks;i++){if(!this.uploadedChunks.includes(i)){chunksToUpload.push(i);}}// 依次上传未完成的切片for(constchunkIndexofchunksToUpload){constsuccess=awaitthis.uploadChunk(chunkIndex);if(!success){console.error(`切片${chunkIndex}上传失败`);returnfalse;}this.currentChunk=chunkIndex;}// 所有切片上传完成,通知后端合并文件if(this.uploadedChunks.length===this.totalChunks){awaitthis.mergeFiles();localStorage.removeItem(`upload_${this.file.name}_progress`);returntrue;}returnfalse;}// 通知后端合并文件asyncmergeFiles(){try{constresponse=awaitfetch('/merge.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({fileName:this.file.name,totalChunks:this.totalChunks,encryptKey:this.encryptKey})});returnresponse.ok;}catch(error){console.error('合并文件失败:',error);returnfalse;}}}// 文件夹上传处理classFolderUploader{constructor(){this.folderStructure={};}// 处理文件夹上传asyncuploadFolder(files,basePath=''){constuploaders=[];for(constfileoffiles){constrelativePath=file.webkitRelativePath||file.relativePath;constfilePath=basePath?`${basePath}/${relativePath}`:relativePath;// 保存文件路径结构this.folderStructure[filePath]=file;// 创建大文件上传实例constuploader=newBigFileUploader({file:file,encryptKey:'your-secret-key'// 实际项目应该更安全地处理密钥});uploaders.push(uploader.startUpload());}// 等待所有文件上传完成constresults=awaitPromise.all(uploaders);returnresults.every(success=>success);}}

后端实现 (PHP)

'缺少必要参数']));}// 创建上传目录$uploadDir='uploads/'.md5($fileName);if(!is_dir($uploadDir)){mkdir($uploadDir,0777,true);}// 保存切片文件$chunkFile=$uploadDir.'/'.$fileName.'.part'.$chunkIndex;move_uploaded_file($_FILES['file']['tmp_name'],$chunkFile);// 保存切片元数据$metaFile=$uploadDir.'/meta.json';$metaData=file_exists($metaFile)?json_decode(file_get_contents($metaFile),true):[];$metaData['chunks'][]=$chunkIndex;$metaData['fileName']=$fileName;$metaData['fileSize']=$fileSize;$metaData['totalChunks']=$totalChunks;$metaData['iv']=$iv;// 保存初始化向量用于解密file_put_contents($metaFile,json_encode($metaData));echojson_encode(['success'=>true]);?>
'缺少必要参数']));}$uploadDir='uploads/'.md5($fileName);$metaFile=$uploadDir.'/meta.json';if(!file_exists($metaFile)){http_response_code(404);die(json_encode(['error'=>'找不到上传记录']));}$metaData=json_decode(file_get_contents($metaFile),true);// 检查是否所有切片都已上传if(count($metaData['chunks'])!==$totalChunks){http_response_code(400);die(json_encode(['error'=>'切片不完整']));}// 创建最终文件$finalPath='uploads/'.basename($fileName);$finalFile=fopen($finalPath,'wb');// 按顺序合并所有切片for($i=0;$i<$totalChunks;$i++){$chunkFile=$uploadDir.'/'.$fileName.'.part'.$i;$chunkData=file_get_contents($chunkFile);// 如果有加密密钥,则解密数据if($encryptKey&&isset($metaData['iv'])){// 这里应该实现解密逻辑// 实际项目中应该使用更安全的解密方案$chunkData=$this->decryptChunk($chunkData,$encryptKey,$metaData['iv']);}fwrite($finalFile,$chunkData);unlink($chunkFile);// 删除切片文件}fclose($finalFile);unlink($metaFile);// 删除元数据文件// 如果需要存储到阿里云OSS$this->uploadToOSS($finalPath);echojson_encode(['success'=>true,'path'=>$finalPath]);functiondecryptChunk($encryptedData,$key,$iv){// 这里实现解密逻辑// 实际项目中应该使用更安全的实现return$encryptedData;// 简化示例}functionuploadToOSS($filePath){// 实现阿里云OSS上传逻辑}?>

支持IE8的兼容方案

// IE8兼容性处理if(!window.localStorage){window.localStorage={_data:{},setItem:function(id,val){this._data[id]=String(val);// 使用cookie作为fallbackdocument.cookie=id+"="+encodeURIComponent(val)+"; path=/";},getItem:function(id){returnthis._data.hasOwnProperty(id)?this._data[id]:undefined;},removeItem:function(id){deletethis._data[id];document.cookie=id+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";},clear:function(){this._data={};// 清除所有cookie可能不实际,这里只是示例}};// 初始化时从cookie加载varcookies=document.cookie.split(';');for(vari=0;i<cookies.length;i++){varcookie=cookies[i].trim();vareqPos=cookie.indexOf('=');varname=eqPos>-1?cookie.substr(0,eqPos):cookie;localStorage._data[name]=decodeURIComponent(cookie.substr(eqPos+1));}}// File API 兼容性处理if(!window.File||!window.FileReader||!window.FileList||!window.Blob){alert('您的浏览器不支持HTML5 File API,请使用现代浏览器');}// FormData 兼容性处理if(!window.FormData){document.write('<\/script>');}

总结

这个方案实现了:

  1. 大文件分片上传
  2. 断点续传(使用localStorage保存进度)
  3. 简单的加密传输和存储
  4. 文件夹上传保留层级结构
  5. IE8+兼容性处理

当然,实际项目中还需要考虑更多安全性和性能优化问题。希望这个方案能帮助你完成毕业设计!

PS:关于工作推荐…要不你先把这项目做出来,这就是你最好的简历了!😂

安装环境

PHP:7.2.14

调整块大小

NOSQL

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

SQL

创建数据库

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

配置数据库连接

安装依赖

访问页面进行测试

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

免费下载示例

点击下载完整示例

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

国产化系统中PHP如何实现视频大文件的分块分享?

【一个武汉大四狗的"大文件上传"自救实录&#xff1a;从"PHP&#xff1f;那不是用来写留言板的吗&#xff1f;“到"哥的上传系统能扛住整个光谷的流量&#xff01;”】 "同学&#xff0c;你简历上写’熟悉PHP开发’&#xff0c;那能说说怎么用PHP实现…

作者头像 李华
网站建设 2026/10/13 21:05:18

Qt学习第一个程序:Hello,World

本文将以Qt 5/6&#xff08;通用步骤&#xff0c;两者无核心差异&#xff09;、Qt Creator开发工具为例&#xff0c;完成经典的Hello&#xff0c;World程序&#xff0c;包含纯代码编写和UI拖拽两种方式&#xff0c;步骤详细且适合零基础入门&#xff0c;确保每一步都能落地执行…

作者头像 李华
网站建设 2026/10/14 17:59:46

互联网大厂Java求职面试实战:多技术栈与业务场景深度解析

互联网大厂Java求职面试实战&#xff1a;多技术栈与业务场景深度解析 本文通过一个企业协同与SaaS场景的面试故事&#xff0c;真实展现互联网大厂Java求职者谢飞机与严肃面试官的问答过程&#xff0c;涵盖Java SE、Spring Boot、微服务、数据库、缓存、消息队列、安全框架、AI等…

作者头像 李华
网站建设 2026/10/15 14:33:07

从 .env 到动态配置:前端工程的一次升级

点击上方 程序员成长指北&#xff0c;关注公众号 回复1&#xff0c;加入高级Node交流群 前言 很多前端和 Node.js 项目&#xff0c;配置管理几乎都是从环境变量开始的&#xff1a;.env、process.env、再配合一次部署。但当你需要临时关掉一个功能、调整接口限流、做灰度发布时&…

作者头像 李华
网站建设 2026/10/12 20:30:44

军工装备管理系统TinyMCE4导入PDF图纸出现字体缺失怎么办?

项目需求技术评估与实施方案 一、需求背景分析 作为北京某国企项目负责人&#xff0c;我们当前面临在企业网站后台管理系统中集成Word粘贴、文档导入和微信公众号内容处理功能的迫切需求。该需求源于政府项目对文档处理能力提升的要求&#xff0c;同时需要满足信创国产化环境…

作者头像 李华
网站建设 2026/10/10 22:08:15

告别杂乱!NAS 装个 Sun-Panel+cpolar,数据管理居然能这么省心

Sun-Panel 是一款主打可视化整合的私有云管理工具&#xff0c;核心功能是把 NAS、服务器、常用工具的访问入口收拢到统一面板&#xff0c;支持多账号权限隔离&#xff0c;还能自定义界面样式&#xff0c;适配 Windows、macOS、Linux 等多系统&#xff0c;甚至树莓派也能流畅运行…

作者头像 李华