核心内容摘要
SenseVoice Small语音转文字:5分钟搭建极速听写服务
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.
-
{alert(建议您\n
升级浏览器\n
升级电脑\n
升级甲方);// 但还得含泪兼容document.write(欢迎来到2010年);}}// 文件夹上传核心逻辑 - 用原生JS重造轮子functionuploadFolder(folder){constfilesfolder.files;// 天真IE8压根不支持这个// 于是有了下面的兼容代码...if(typeoffilesundefined){alert(您的浏览器太古董建议用U盘传文件);return;}// 遍历文件夹结构 - IE8需要ActiveX辅助for(leti0;ifiles.length;i){constfilefiles[i];constpathfile.webkitRelativePath||未知路径;// 分片上传逻辑...}}后端PHP方案 - 100块的艺术// 大文件上传处理classUploadHandler{publicfunctionhandle(){// 预算检查if($this-budget
{header(Content-Type: application/json);die(json_encode([error预算不足功能缩水]));}// 接收文件$file$_FILES[file];$tmpName$file[tmp_name];// 检查磁盘空间 - 20G啊大哥$freeSpacedisk_free_space(/);if($freeSpace20*1024*1024*
{thrownewException(磁盘空间不足建议甲方加钱买硬盘);}// 加密存储 - 预算只够base64$encryptedContentbase64_encode(file_get_contents($tmpName));file_put_contents(/uploads/.$file[name]..enc,$encryptedContent);// 记录进度到MySQL$pdonewPDO(mysql:hostlocalhost;dbnameupload,root,);$stmt$pdo-prepare(INSERT INTO uploads (...) VALUES (...));$stmt-execute();}}完整代码示范乞丐版前端HTMLJS (兼容IE
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
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,statusfailed];continue;}// 模拟加密 - 真加密太贵了$contentfile_get_contents($tmpName);$encryptedbase64_encode($content);// 这就是100块的加密// 保存文件$savePath$uploadDir./.$name;file_put_contents($savePath,$encrypted);$results[][name$name,statussuccess];}echojson_encode([results$results]);开发者的自我救赎IE8兼容心得// 检测IE8的优雅方式functionisIE8(){return/*cc_on!*/false||document.documentMode8;}if(isIE8()){// 放弃治疗的代码document.body.innerHTML请升级浏览器;}大文件上传技巧// 分片上传伪代码functionuploadChunk($chunk){// 检查预算if($this-budget
{thrownewException(请甲方续费);}// 每上传1MB扣1块钱$this-budget-(strlen($chunk)/(1024*
);// 剩余预算显示echo当前剩余预算{$this-budget}元;}断点续传黑科技-- MySQL记录上传进度CREATETABLEIFNOTEXISTSupload_progress(idVARCHAR(
PRIMARYKEY,progressINTDEFAULT0,last_updateTIMESTAMP,-- 100块预算的表结构cost_remainingDECIMAL(10,
)ENGINEMyISAM;-- 因为InnoDB太贵了项目
总结与人生感悟这个项目让我明白100块不是开发费用是入场券IE8不是浏览器是时光机20G文件不是需求是谋杀7*24支持不是服务是卖身最终解决方案建议客户加两个零或者加入我的QQ接单群(
加群送价值百万的残缺代码推荐项目可获20%提成超级会员享受50%分成一起用爱发电照亮前程郑重声明以上代码仅供娱乐真实开发请先谈好预算再动手安装环境PHP:
7.
14调整块大小NOSQLNOSQL不需要任何配置可以直接访问测试SQL创建数据库您可以直接复制脚本进行创建配置数据库连接安装依赖访问页面进行测试数据表中的数据效果预览文件上传文件刷新续传支持离线保存文件进度在关闭浏览器刷新浏览器后进行不丢失仍然能够继续上传文件夹上传支持上传文件夹并保留层级结构同样支持进度信息离线保存刷新页面关闭页面重启系统不丢失上传进度。
免费下载示例点击下载完整示例