news 2026/10/15 19:45:25

PHP处理500M大文件目录结构上传的解决方案是什么?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP处理500M大文件目录结构上传的解决方案是什么?

重庆老码农的「百元预算大文件传输」解决方案


一、项目开场白

各位同行好!老张我今年45岁,头发都快掉光了还在写代码。最近接了个「20G文件夹上传」的活儿,客户要求用原生JS+PHP实现,预算100块还要7*24小时支持…(掏出速效救心丸)不过咱是讲武德的人,既然接了活儿就得办漂亮!


二、技术选型(穷人版)

组件替代方案成本
WebUploader自己造轮子(原生JS+Flash回退)0元
SM4加密调用WebCrypto API(AES兼容模式)0元
断点续传localStorage+MySQL+OSS分片存储0元
文件夹上传``0元

三、前端核心代码(Vue3兼容版)

export default { data() { return { isIE8: /*@cc_on!@*/false || !!document.documentMode, progress: 0, apiUrl: '/api/upload.php', chunkSize: 5 * 1024 * 1024, // 5MB分片 fileId: '' } }, methods: { triggerFileInput() { if (this.isIE8) { // IE8特殊处理:弹窗提示用Flash alert('请使用上方Flash按钮上传文件夹'); } else { document.getElementById('fileInput').click(); } }, async handleFileSelect(e) { const files = e.target.files; if (!files.length) return; // 生成唯一文件ID(保留路径结构) this.fileId = this.generateFileId(files[0]); // 初始化进度记录 localStorage.setItem(`progress_${this.fileId}`, '0'); // 并行上传所有文件(演示简化版) for (let i = 0; i < files.length; i++) { await this.uploadFile(files[i]); } }, generateFileId(file) { // 兼容IE8的路径处理 const path = file.webkitRelativePath || (file.fullPath ? file.fullPath.split('\\').join('/') : ''); return `${path}-${file.size}-${file.lastModified}`; }, async uploadFile(file) { const totalChunks = Math.ceil(file.size / this.chunkSize); let uploadedChunks = parseInt(localStorage.getItem(`progress_${this.fileId}`) || '0'); for (let i = uploadedChunks; i < totalChunks; i++) { const start = i * this.chunkSize; const end = Math.min(file.size, start + this.chunkSize); const blob = file.slice(start, end); // 加密数据(AES兼容模式) const encrypted = await this.encryptData(blob, 'AES'); // 上传分片 const formData = new FormData(); formData.append('file', encrypted, `chunk_${i}`); formData.append('fileId', this.fileId); formData.append('chunkIndex', i); formData.append('totalChunks', totalChunks); try { await fetch(this.apiUrl, { method: 'POST', body: formData }); // 更新进度 uploadedChunks = i + 1; localStorage.setItem(`progress_${this.fileId}`, uploadedChunks); this.progress = Math.round((uploadedChunks / totalChunks) * 100); } catch (err) { console.error('上传失败:', err); // 失败后自动重试3次 i--; if (i < 0) break; } } // 上传完成后清理记录 if (uploadedChunks === totalChunks) { localStorage.removeItem(`progress_${this.fileId}`); alert('上传完成!'); } }, // 简易加密(实际项目请用WebCrypto) encryptData(data, algorithm) { return new Promise(resolve => { // 这里只是演示,实际要用SM4/AES加密库 const reader = new FileReader(); reader.onload = (e) => { // 假装加密了... resolve(new Blob([e.target.result])); }; reader.readAsArrayBuffer(data); }); } } }

四、PHP后端代码(穷人版)

'your-access-key','accessKeySecret'=>'your-secret-key','endpoint'=>'oss-cn-hangzhou.aliyuncs.com','bucket'=>'your-bucket'];// 接收参数$fileId=$_POST['fileId']??'';$chunkIndex=$_POST['chunkIndex']??0;$totalChunks=$_POST['totalChunks']??1;// 保存分片到临时目录$tempDir="/tmp/uploads/{$fileId}";if(!is_dir($tempDir)){mkdir($tempDir,0777,true);}$tempPath="{$tempDir}/chunk_{$chunkIndex}";move_uploaded_file($_FILES['file']['tmp_name'],$tempPath);// 记录上传进度(实际项目请用Redis)$db=newmysqli('localhost','root','password','file_db');$stmt=$db->prepare("INSERT INTO upload_progress (file_id, chunk_index, total_chunks, uploaded_at) VALUES (?, ?, ?, NOW()) ON DUPLICATE KEY UPDATE updated_at = NOW()");$stmt->bind_param("sii",$fileId,$chunkIndex,$totalChunks);$stmt->execute();// 检查是否所有分片都已上传$result=$db->query("SELECT COUNT(*) as count FROM upload_progress WHERE file_id = '{$fileId}' AND chunk_index <{$totalChunks}");$row=$result->fetch_assoc();if($row['count']==$totalChunks){// 合并分片并上传到OSS(简化版)$finalPath="/tmp/{$fileId}.dat";$cmd="cat{$tempDir}/chunk_* >{$finalPath}";exec($cmd);// 上传到OSS(实际项目请用阿里云SDK)$ossPath="uploads/{$fileId}.dat";$cmd="ossutil64 cp{$finalPath}oss://{$ossConfig['bucket']}/{$ossPath}";exec($cmd);// 清理临时文件array_map('unlink',glob("{$tempDir}/*"));rmdir($tempDir);unlink($finalPath);echojson_encode(['success'=>true,'message'=>'文件合并完成']);}else{echojson_encode(['success'=>true,'message'=>'分片保存成功']);}// 数据库表结构/* CREATE TABLE upload_progress ( id INT AUTO_INCREMENT PRIMARY KEY, file_id VARCHAR(255) NOT NULL, chunk_index INT NOT NULL, total_chunks INT NOT NULL, uploaded_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, UNIQUE KEY (file_id, chunk_index) ); */?>

五、IE8兼容方案(魔法版)

  1. Flash回退方案:

    • 使用SWFUpload组件处理文件夹上传
    • 通过ExternalInterface与JS通信
    • 示例代码太长,群里见…
  2. ActiveX控件(终极方案):

function uploadFolder() { try { const folderPath = prompt("请输入文件夹路径(如C:\\data):"); if (folderPath) { uploaderCtrl.UploadFolder(folderPath, "http://your-server/api/ie8_upload.php"); } } catch (e) { alert("请安装我们的专用上传控件!"); } }

六、部署指南(白嫖版)

  1. 服务器配置:

    • 安装PHP + MySQL + Nginx
    • 配置ossutil工具(阿里云官方命令行工具)
    • 设置/tmp/uploads目录权限为777
  2. 数据库初始化:

CREATEDATABASEfile_db;USEfile_db;-- 上传进度表(见PHP代码部分)
  1. 定时清理任务:
# 每天凌晨清理未完成的上传00* * *rm-rf /tmp/uploads/*

七、项目总结

  1. 预算控制:

    • 代码全部自己写(0元)
    • 服务器用阿里云学生机(10元/月)
    • 域名用免费TK域名(0元)
  2. 技术支持:

    • 加入QQ群:374992201
    • 喊一声"老张救命!"优先响应
  3. 后续优化方向:

    • 替换Flash为WebAssembly方案
    • 增加P2P加速上传
    • 实现真正的SM4加密(需要C扩展)

最后声明:本方案仅供学习交流,实际项目请考虑购买商业授权(主要是怕律师函)。群里经常发红包,进来薅羊毛也值了!🚀

安装环境

PHP:7.2.14

调整块大小

NOSQL

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

SQL

创建数据库

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

配置数据库连接

安装依赖

访问页面进行测试

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

免费下载示例

点击下载完整示例

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

ops-nn Upsample插值优化 HBM带宽性能提升实战

摘要 最近在调试SDXL模型的上采样层时&#xff0c;发现NPU的HBM带宽利用率始终上不去。通过深入分析ops-nn仓库中的Upsample算子实现&#xff0c;特别是在/operator/ops_nn/upsample/nearest_neighbor.cpp中的内存访问模式&#xff0c;发现stride参数配置对性能有关键影响。本…

作者头像 李华
网站建设 2026/10/15 16:48:42

蓝易云 :简单shell脚本的编写教程

下面这份内容&#xff0c;站在真实运维与企业自动化的视角&#xff0c;从“为什么要写 → 怎么写 → 写完能干嘛”一步步拆开讲&#xff0c;不堆术语、不玩花活&#xff0c;全部可落地。一、什么是 Shell 脚本&#xff08;先把定位讲清楚&#xff09;&#x1f9e0;Shell 脚本本…

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

蓝易云 :centos用ssh登录连接缓慢处理

下面这份内容&#xff0c;完全站在真实运维与生产环境角度&#xff0c;把 CentOS 使用 SSH 登录缓慢 这个问题 拆因果、给方案、能直接落地 地讲清楚。不玄学、不空谈&#xff0c;每一步都有明确逻辑。一、先给结论&#xff1a;SSH 慢&#xff0c;绝不是“网络玄学”&#x1f9…

作者头像 李华
网站建设 2026/10/14 13:01:09

军工项目文档管理如何适配UEDITOR的跨平台特性?

CMS企业官网项目需求分析与解决方案 大家好&#xff0c;我是安徽的一名.NET程序员&#xff0c;最近接了个CMS企业官网的外包项目。客户提出了一个新需求&#xff0c;要在后台新闻管理系统的文章发布模块编辑器中增加导入Word、Excel、PPT、PDF文档和Word一键粘贴功能。这需求听…

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

教育信息化如何通过百度编辑器实现课件PPT转HTML?

企业网站后台管理系统富文本编辑器Word集成解决方案评估与实施报告 项目负责人&#xff1a;XXX 日期&#xff1a;2023-XX-XX 一、需求背景分析 当前集团企业网站后台管理系统存在以下核心需求&#xff1a; 需要实现Word内容完美粘贴&#xff08;保留所有样式和特殊元素&…

作者头像 李华
网站建设 2026/10/14 13:12:50

医疗系统如何通过富文本编辑器实现DICOM图像转存?

广东某国企项目负责人技术选型与开发实施记录 一、需求背景与核心目标 为满足政府客户在企业网站后台管理系统升级需求&#xff0c;需在UEditor富文本编辑器中扩展三大功能&#xff1a; Word粘贴增强&#xff1a;支持图文混排、样式保留、图片自动上传至华为云OBSOffice文档…

作者头像 李华