当前位置: 首页 > news >正文

能源化工行业,PHP大文件上传与断点续传的解决方案?

开发者日记:2024年X月X日 星期X 长沙 阴

项目背景
今日正式接手客户的大文件传输系统外包项目,需求明确:支持20G文件/文件夹上传下载、跨平台(Windows/macOS/Linux)、全浏览器兼容(含IE8)、断点续传、保留文件夹层级结构,后端PHP+MySQL,前端Vue3+WebUploader/H5,存储用阿里云OSS。客户要求免费开源代码和7*24小时支持,压力山大但挑战性十足。


技术选型与难点分析

  1. 前端框架

    • Vue3 CLI:组件化开发,响应式数据绑定。
    • WebUploader:兼容IE8+,支持分片上传,但需二次开发文件夹上传。
    • H5 File API:现代浏览器备用方案,需Polyfill兼容旧版。
  2. 后端架构

    • PHP:轻量级处理文件分片合并与OSS交互。
    • MySQL:存储文件元数据(路径、分片信息、断点记录)。
  3. 核心难点

    • 文件夹层级保留:需递归解析文件夹结构,生成JSON树形结构上传。
    • 断点续传:通过本地Storage+Server记录分片上传进度,重启后恢复。
    • 大文件分片:前端按4MB分片,后端合并后上传OSS。

前端代码实现(Vue3 + WebUploader)

1. 初始化WebUploader(兼容IE8)
// src/components/Uploader.vueimport{onMounted,ref}from'vue';importWebUploaderfrom'webuploader';import'webuploader/dist/webuploader.css';exportdefault{setup(){constuploader=ref(null);onMounted(()=>{// 动态加载Flash(IE8兼容)if(window.WebUploader&&!WebUploader.Uploader.support('HTML5')){constflashUrl='/path/to/Uploader.swf';WebUploader.Uploader.register({name:'flash',fn:()=>flashUrl});}uploader.value=newWebUploader.Uploader({swf:'/path/to/Uploader.swf',// IE8备用server:'/api/upload',pick:'#picker',chunked:true,chunkSize:4*1024*1024,// 4MB分片threads:3,formData:{fileId:'',// 由后端生成唯一IDisDir:false// 标记是否为文件夹},// 保留文件夹结构的关键:自定义文件对象accept:{title:'Files',extensions:'*',mimeTypes:'*'}});// 监听文件添加(处理文件夹)uploader.value.on('filesQueued',(files)=>{files.forEach(file=>{if(file.isDir){// 递归处理文件夹(需自定义逻辑)parseDirectory(file);}else{uploadFile(file);}});});});// 模拟文件夹解析(实际需调用WebUploader的目录选择API)constparseDirectory=(dirFile)=>{// 此处需结合H5 File System API或插件实现层级解析console.log('Folder structure:',dirFile.fullPath);};return{uploader};}};
2. 文件夹上传逻辑(H5 Fallback)
// 兼容现代浏览器的文件夹上传(IE8跳过)consthandleFolderInput=(event)=>{if(!window.File&&window.DirectoryReader)return;// 检测H5 API支持constfiles=[];constdirectoryReader=event.target.webkitGetAsEntry();// Chrome/Firefoxif(directoryReader&&directoryReader.isDirectory){constreader=directoryReader.createReader();reader.readEntries((entries)=>{entries.forEach(entry=>{if(entry.isFile){entry.file(file=>files.push(file));}elseif(entry.isDirectory){// 递归处理子目录handleFolderInput({target:{webkitGetAsEntry:()=>entry}});}});});}};

后端代码实现(PHP + MySQL)

1. 分片接收与合并
// api/upload.phpprepare("INSERT INTO upload_progress (file_id, chunk_index, total_chunks, uploaded_at) VALUES (?, ?, ?, NOW())");$stmt->execute([$fileId,$chunkIndex,$totalChunks]);// 如果是最后一块,合并并上传OSSif($chunkIndex===$totalChunks-1){$finalPath="{$tempDir}/final_file";$fp=fopen($finalPath,'wb');for($i=0;$i<$totalChunks;$i++){$chunkContent=file_get_contents("{$tempDir}/chunk_{$i}");fwrite($fp,$chunkContent);}fclose($fp);// 上传到阿里云OSS(需引入OSS SDK)require_once'oss-sdk/autoload.php';$ossClient=newOSS\OssClient('key','secret','endpoint');$ossClient->putObject('bucket-name',"uploads/{$fileId}",$finalPath);// 清理临时文件array_map('unlink',glob("{$tempDir}/*"));rmdir($tempDir);}echojson_encode(['success'=>true,'fileId'=>$fileId]);?>
2. MySQL表结构
CREATETABLEupload_progress(idINTAUTO_INCREMENTPRIMARYKEY,file_idVARCHAR(64)NOTNULL,chunk_indexINTNOTNULL,total_chunksINTNOTNULL,uploaded_atDATETIMENOTNULL,UNIQUEKEY(file_id,chunk_index));

断点续传实现

  1. 前端存储:使用localStorage记录未完成的fileIdchunkIndex
  2. 后端查询:上传前检查MySQL中已存在的分片,跳过已上传部分。
// 前端恢复上传逻辑constresumeUpload=(fileId)=>{fetch(`/api/check-progress?fileId=${fileId}`).then(res=>res.json()).then(data=>{if(data.completedChunks<data.totalChunks){uploader.value.option('formData',{fileId,chunk:data.completedChunks});uploader.value.upload();}});};

今日总结

  • 进展:完成基础分片上传逻辑,兼容性方案初步验证。
  • 问题
    1. WebUploader原生不支持文件夹层级解析,需结合H5 API或第三方插件(如webuploader-directory)。
    2. IE8的Flash上传稳定性需进一步测试。
  • 明日计划
    1. 实现完整的文件夹递归上传逻辑。
    2. 编写OSS上传模块和断点续传接口。

求助:若有大神熟悉WebUploader文件夹上传或OSS集成,欢迎加入QQ群374992201指导!代码将完全开源回馈社区。


(注:实际项目需补充安全校验、错误处理和性能优化代码。)

安装环境

PHP:7.2.14

调整块大小

NOSQL

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

SQL

创建数据库

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

配置数据库连接

安装依赖

访问页面进行测试

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

免费下载示例

点击下载完整示例

http://www.jsqmd.com/news/253279/

相关文章:

  • mqtt之轻量级客户端协议源码实现(方便移植,亲测好用)
  • Elasticsearch Swarm 单机部署和测试流程
  • TCP/IP协议栈:从原理到实战全解析
  • Google AI Studio+Gemini Pro:小白也能驾驭的AI魔法组合
  • 突破限制:巧用Azure OpenAI,畅玩Gemini模型
  • 解锁Gemini:Firebase平台合规调用AI模型实战全攻略
  • 【Python高级编程】辅助教师教学工具:PTA 成绩统计小程序
  • 汇川md380量产参考方案,包括原理图、PCB设计图及矢量源码:现成解决方案,轻松量产学习利器
  • 将本地代码推送到 GitHub 的方法
  • 亲测好用8个AI论文工具,助本科生轻松搞定毕业论文!
  • Bulk+ATAC+scRNA+TCR-seq+CUTTag+代谢+空间转录组:拆解Cell力作,掌握多组学联合分析(附代码)
  • 告别绘图内卷!虎贲等考 AI 科研绘图功能让数据秒变顶刊级图表
  • 在线教程丨Qwen-Image-2512正式开源,告别AI生图塑料感,仅需文字指令实现真实毛发
  • 工业物联网关在管网、泵站、水厂等智慧水务场景的应用
  • 学长亲荐!专科生必备TOP10一键生成论文工具测评
  • 开题报告零返工!虎贲等考 AI:一键搭建导师认可的学术骨架
  • AI 写论文哪个软件最好?实测封神!虎贲等考 AI 凭硬核实力成毕业刚需
  • XZ后门事件深度剖析:供应链攻击与防御策略
  • 打开游戏提示DirectX Runtime插件出错。附解决办法
  • 深入解析TCP/IP协议栈:从原理到前沿
  • 写个隐藏磁盘的小工具
  • 救命神器9个一键生成论文工具,研究生高效写作必备!
  • 亲测好用!8个AI论文工具测评:研究生开题报告全攻略
  • 亲测好用!8个AI论文工具测评:研究生开题报告全攻略
  • 同样是库存管理,ERP 和 WMS 根本不在一个层级:拆开 3 个层面你就明白了
  • 企业级AI开发的“灵活密码”:插件化扩展为何成刚需?
  • 帧同步与状态同步
  • Java团队做企业级AI开发,为什么要选事件驱动架构?
  • AI模型学习——上下文管理
  • 企业AI落地“从零试错”?这套生产级框架+场景库能直接用