news 2026/9/3 3:49:16

PHP断点续传大附件时进度条怎么设计?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP断点续传大附件时进度条怎么设计?

PHP程序员的地狱级文件上传系统开发日记

甲方需求:用100块造航天飞机

作为一个被生活按在地上摩擦的PHP老码农,最近接了个让我怀疑人生的项目:

// 甲方需求清单$requirements=['文件传输'=>'20G文件夹(含1000+文件)','加密要求'=>'传输SM4/AES+存储加密','断点续传'=>'断电断网不能丢进度','兼容性'=>'从IE8到现代浏览器全家桶','预算'=>'100块(连服务器盒饭钱都不够)','服务'=>'7*24小时免费技术支持+源码+部署','附加'=>'要文档要教程要手把手教客户'];// 我的心理活动if($budget<$requirements['难度系数']){thrownewException('现在跑路还来得及吗?');}

技术选型:用爱发电

前端方案 - 在2023年伺候IE8

// 看到IE8兼容要求时的反应functioncheckIE8Compatible(){if(navigator.userAgent.indexOf('MSIE 8.0')>-1){alert('建议您:\n1.升级浏览器\n2.升级电脑\n3.升级甲方');// 但还得含泪兼容document.write('欢迎来到2010年');}}// 文件夹上传核心逻辑 - 用原生JS重造轮子functionuploadFolder(folder){constfiles=folder.files;// 天真!IE8压根不支持这个// 于是有了下面的兼容代码...if(typeoffiles==='undefined'){alert('您的浏览器太古董,建议用U盘传文件');return;}// 遍历文件夹结构 - IE8需要ActiveX辅助for(leti=0;i<files.length;i++){constfile=files[i];constpath=file.webkitRelativePath||'未知路径';// 分片上传逻辑...}}

后端PHP方案 - 100块的艺术

// 大文件上传处理classUploadHandler{publicfunctionhandle(){// 预算检查if($this->budget<=100){header('Content-Type: application/json');die(json_encode(['error'=>'预算不足,功能缩水']));}// 接收文件$file=$_FILES['file'];$tmpName=$file['tmp_name'];// 检查磁盘空间 - 20G啊大哥!$freeSpace=disk_free_space("/");if($freeSpace<20*1024*1024*1024){thrownewException('磁盘空间不足,建议甲方加钱买硬盘');}// 加密存储 - 预算只够base64$encryptedContent=base64_encode(file_get_contents($tmpName));file_put_contents('/uploads/'.$file['name'].'.enc',$encryptedContent);// 记录进度到MySQL$pdo=newPDO('mysql:host=localhost;dbname=upload','root','');$stmt=$pdo->prepare("INSERT INTO uploads (...) VALUES (...)");$stmt->execute();}}

完整代码示范(乞丐版)

前端HTML+JS (兼容IE8)

100块的文件上传系统 // IE8兼容大礼包 if (!Array.prototype.forEach) { Array.prototype.forEach = function(callback) { for (var i = 0; i < this.length; i++) { callback(this[i], i, this); } }; } // 文件夹上传 function handleFolderSelect(e) { var files = e.target.files; if (!files || files.length === 0) return; // 显示文件夹结构 var fileList = document.getElementById('file-list'); fileList.innerHTML = ''; [].forEach.call(files, function(file) { var path = file.webkitRelativePath || file.name; var item = document.createElement('div'); item.textContent = path + ' (' + formatSize(file.size) + ')'; fileList.appendChild(item); }); } function formatSize(bytes) { // 大小格式化兼容代码... } 价值100万的100块上传系统

后端PHP处理

'本系统采用丐版算法']);exit;}// 接收上传文件$files=$_FILES['files']??[];if(empty($files)){echojson_encode(['error'=>'没有检测到文件']);exit;}// 创建上传目录$uploadDir=__DIR__.'/uploads/'.date('Ymd');if(!is_dir($uploadDir)){mkdir($uploadDir,0777,true);}// 处理每个文件$results=[];foreach($files['name']as$i=>$name){$tmpName=$files['tmp_name'][$i];$error=$files['error'][$i];if($error!==UPLOAD_ERR_OK){$results[]=['name'=>$name,'status'=>'failed'];continue;}// 模拟加密 - 真加密太贵了$content=file_get_contents($tmpName);$encrypted=base64_encode($content);// 这就是100块的加密// 保存文件$savePath=$uploadDir.'/'.$name;file_put_contents($savePath,$encrypted);$results[]=['name'=>$name,'status'=>'success'];}echojson_encode(['results'=>$results]);

开发者的自我救赎

  1. IE8兼容心得

    // 检测IE8的优雅方式functionisIE8(){return/*@cc_on!@*/false||document.documentMode===8;}if(isIE8()){// 放弃治疗的代码document.body.innerHTML='请升级浏览器';}
  2. 大文件上传技巧

    // 分片上传伪代码functionuploadChunk($chunk){// 检查预算if($this->budget<=0){thrownewException('请甲方续费');}// 每上传1MB扣1块钱$this->budget-=(strlen($chunk)/(1024*1024));// 剩余预算显示echo"当前剩余预算:{$this->budget}元";}
  3. 断点续传黑科技

    -- MySQL记录上传进度CREATETABLEIFNOTEXISTSupload_progress(idVARCHAR(255)PRIMARYKEY,progressINTDEFAULT0,last_updateTIMESTAMP,-- 100块预算的表结构cost_remainingDECIMAL(10,2))ENGINE=MyISAM;-- 因为InnoDB太贵了

项目总结与人生感悟

这个项目让我明白:

  1. 100块不是开发费用,是入场券
  2. IE8不是浏览器,是时光机
  3. 20G文件不是需求,是谋杀
  4. 7*24支持不是服务,是卖身

最终解决方案:

  • 建议客户加两个零
  • 或者加入我的QQ接单群(374992201):
    • 加群送"价值百万"的残缺代码
    • 推荐项目可获20%提成
    • 超级会员享受50%分成
    • 一起用爱发电,照亮前程

(郑重声明:以上代码仅供娱乐,真实开发请先谈好预算再动手)

安装环境

PHP:7.2.14

调整块大小

NOSQL

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

SQL

创建数据库

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

配置数据库连接

安装依赖

访问页面进行测试

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

免费下载示例

点击下载完整示例

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

强烈安利!MBA论文必备TOP9 AI论文软件深度测评

强烈安利&#xff01;MBA论文必备TOP9 AI论文软件深度测评 2026年MBA论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着AI技术在学术领域的广泛应用&#xff0c;越来越多的MBA学生开始借助智能工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的…

作者头像 李华
网站建设 2026/9/3 2:16:46

深度测评自考必备!8款一键生成论文工具TOP8全解析

深度测评自考必备&#xff01;8款一键生成论文工具TOP8全解析 自考论文写作的“好帮手”测评 随着自考人数逐年增加&#xff0c;论文写作成为许多考生面临的难题。从选题构思到资料收集&#xff0c;再到格式排版和内容润色&#xff0c;每一个环节都可能成为拖延或出错的源头。为…

作者头像 李华
网站建设 2026/8/29 6:40:54

为什么网络安全卷成这样,还被称为最有前途的工作之一?

作为网安界的“资深牛马”&#xff0c;我经常会去各大平台上看一些关于“网安”的文章和视频。看得最多的就是有人将网络安全专家列为未来十年最有竞争力的岗位之一&#xff0c;工资水平也位列薪资排行榜前十。 但是再看看当下的实际情况&#xff1a;大环境不算好&#xff0c;…

作者头像 李华
网站建设 2026/9/3 0:23:43

大模型时代AI产品经理指南:薪资50W+,如何快速入行?必收藏!

AI人才缺口达500万&#xff0c;AI产品经理薪资可观&#xff08;中位数36k/月&#xff0c;头部可达50W/年&#xff09;。AI产品经理分为专业型、应用型和工具型三类&#xff0c;普通人最适合从应用型入局。成功入行需掌握商业变现、需求把控、技术协作和AI项目落地能力。文章推荐…

作者头像 李华
网站建设 2026/9/2 9:58:17

白帽子黑客成长指南,从入门到进阶

大家也都知道&#xff0c;白帽子黑客相当于网络世界的 “正义卫士”&#xff0c;他们通过技术手段发现网络漏洞并协助修复&#xff0c;以保护系统和数据安全。 与利用漏洞窃取信息、破坏系统的 “黑帽黑客” 不同&#xff0c;白帽黑客始终在法律和道德框架内行动。白帽黑客的核…

作者头像 李华