news 2026/5/1 10:30:15

PHP教育行业大文件上传进度条怎么实现?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP教育行业大文件上传进度条怎么实现?

开发者日记:毕业设计大文件管理系统开发实录
日期:2023年11月20日
天气:多云转晴

作为一名即将毕业的软件工程学生,我的毕业设计选题是基于WebUploader的大文件管理系统,要求支持20GB文件传输、文件夹层级结构保留,并兼容IE8及国产信创浏览器(如龙芯浏览器、红莲花浏览器)。经过两周的技术攻关,现将关键实现细节和代码片段整理如下,供同样面临毕业设计挑战的同学参考。


一、技术选型与兼容性方案

  1. 前端框架

    • Vue3 CLI+WebUploader(主方案) +HTML5 File API(备选)
    • 浏览器兼容性
      • IE8:使用webuploader.flashonly.js+@babel/polyfill
      • 国产浏览器:测试发现红莲花浏览器需禁用directory属性,改用递归上传
  2. 后端架构

    • PHP 8.0+阿里云OSS SDK
    • 分片上传:固定5MB分片,支持断点续传
    • MD5秒传:通过文件哈希去重
  3. 存储方案

    • 阿里云OSS存储文件本体
    • MySQL记录元数据(文件路径、分片状态、用户权限)

二、核心代码实现

1. 前端兼容性处理(Vue3组件)
// src/components/FileUploader.vueimportWebUploaderfrom'webuploader';import{isIE8,isLoongBrowser}from'@/utils/browserDetect';exportdefault{mounted(){constuploaderConfig={swf:'/static/Uploader.swf',// IE8必需server:'/api/upload',pick:'#picker',accept:{title:'All',extensions:'*'},compress:false,chunked:true,chunkSize:5*1024*1024,// 5MB分片threads:3,formData:{token:localStorage.getItem('upload_token')}};// 国产浏览器降级方案if(isLoongBrowser()||isIE8()){uploaderConfig.directory=false;// 禁用文件夹拖拽uploaderConfig.dnd=false;// 禁用HTML5拖放}constuploader=WebUploader.create(uploaderConfig);// 文件夹递归上传(非IE8环境)if(!isIE8()){uploader.on('beforeFileQueued',(file)=>{if(file.relativePath){this.uploadFolder(file);returnfalse;// 阻止默认队列行为}});}// 分片上传进度uploader.on('uploadProgress',(file,percentage)=>{this.$emit('progress',{name:file.name,progress:percentage});});},methods:{asyncuploadFolder(rootFile){// 递归解析文件夹结构(需配合HTML5 File API)constentries=awaitthis.readDirectory(rootFile);entries.forEach(entry=>{if(entry.isFile){this.uploadSingleFile(entry,rootFile.relativePath);}});}}};
2. 后端分片处理(PHP)
// api/upload.php'your-aliyun-key','accessKeySecret'=>'your-aliyun-secret','endpoint'=>'oss-cn-hangzhou.aliyuncs.com','bucket'=>'your-bucket-name'];// 处理分片上传if($_SERVER['REQUEST_METHOD']==='POST'){$chunk=$_POST['chunk']??0;$chunks=$_POST['chunks']??1;$md5=$_POST['md5']??'';$relativePath=$_POST['relativePath']??'';$userId=$_SESSION['user_id']??0;// 存储临时分片$chunkPath="/tmp/chunks/{$md5}_{$chunk}";move_uploaded_file($_FILES['file']['tmp_name'],$chunkPath);// 记录分片状态到MySQL$pdo=newPDO('mysql:host=localhost;dbname=file_manager','user','password');$stmt=$pdo->prepare("REPLACE INTO file_chunks (md5, chunk_index, user_id) VALUES (?, ?, ?)");$stmt->execute([$md5,$chunk,$userId]);// 合并分片(最后一个分片)if($chunk==$chunks-1){$ossPath="users/{$userId}/{$relativePath}".basename($_POST['name']);$this->mergeChunks($md5,$chunks,$ossPath,$config);// 记录完整文件信息$fileStmt=$pdo->prepare("INSERT INTO files (name, path, md5, size, user_id) VALUES (?, ?, ?, ?, ?)");$fileStmt->execute([$_POST['name'],$ossPath,$md5,$_POST['size'],$userId]);echojson_encode(['status'=>'completed','path'=>$ossPath]);}else{echojson_encode(['status'=>'pending']);}}functionmergeChunks($md5,$chunks,$ossPath,$config){$ossClient=newOssClient($config['accessKeyId'],$config['accessKeySecret'],$config['endpoint']);$tempFile="/tmp/{$md5}_merged";// 合并本地分片for($i=0;$i<$chunks;$i++){file_put_contents($tempFile,file_get_contents("/tmp/chunks/{$md5}_{$i}"),FILE_APPEND);}// 上传至阿里云OSS$ossClient->uploadFile($config['bucket'],$ossPath,$tempFile);// 清理临时文件unlink($tempFile);for($i=0;$i<$chunks;$i++)unlink("/tmp/chunks/{$md5}_{$i}");}
3. MySQL表设计(关键表)
-- 文件分片状态表CREATETABLE`file_chunks`(`id`INTAUTO_INCREMENTPRIMARYKEY,`md5`CHAR(32)NOTNULLCOMMENT'文件MD5',`chunk_index`INTNOTNULLCOMMENT'分片序号',`user_id`INTNOTNULLCOMMENT'所属用户',`created_at`TIMESTAMPDEFAULTCURRENT_TIMESTAMP,UNIQUEKEY`md5_chunk`(`md5`,`chunk_index`));-- 文件元数据表CREATETABLE`files`(`id`INTAUTO_INCREMENTPRIMARYKEY,`name`VARCHAR(255)NOTNULLCOMMENT'文件名',`path`VARCHAR(512)NOTNULLCOMMENT'OSS存储路径',`md5`CHAR(32)NOTNULLCOMMENT'文件哈希',`size`BIGINTNOTNULLCOMMENT'文件大小',`user_id`INTNOTNULLCOMMENT'上传用户',`created_at`TIMESTAMPDEFAULTCURRENT_TIMESTAMP);

三、关键问题与解决方案

  1. IE8文件夹上传

    • 方案:禁用directory属性,改用Flash版WebUploader的普通文件选择
    • 代码:通过``实现多选文件
  2. 红莲花浏览器兼容性

    • 问题:拖拽上传会触发浏览器崩溃
    • 解决:检测到红莲花浏览器时隐藏拖拽区域
  3. 20GB文件内存优化

    • 前端:始终使用FileReader.readAsArrayBuffer分片读取
    • 后端:PHP配置upload_max_filesize = 0(由分片逻辑接管)

四、毕业设计特色功能

  1. 信创浏览器适配

    • 通过User-Agent自动切换兼容模式
    // utils/browserDetect.jsexportfunctionisLoongBrowser(){returnnavigator.userAgent.includes('LoongBrowser');}
  2. 管理员监控面板

    • 基于Vue3 + ECharts实现上传速度实时图表
  3. 安全增强

    • 文件下载需携带JWT令牌
    • 阿里云OSS配置Bucket Policy限制访问

寻求帮助:目前国产浏览器(如奇安信)在文件夹上传时存在路径解析异常,欢迎加入QQ群374992201指导调试!

今日进度:完成基础分片上传,明日将攻克信创浏览器兼容性问题。


(签名)
浙江某高校 · 软件工程1901班 · 张明
2023年11月20日 夜


附:项目地址
GitHub(待开源):https://github.com/graduation-project/file-manager
演示视频:项目根目录/demo/文件夹内

致谢:感谢群里王工提供的国产浏览器测试环境,以及李学长分享的阿里云OSS断点续传方案!

安装环境

PHP:7.2.14

调整块大小

NOSQL

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

SQL

创建数据库

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

配置数据库连接

安装依赖

访问页面进行测试

数据表中的数据

效果预览

文件上传

文件刷新续传

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

文件夹上传

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

免费下载示例

点击下载完整示例

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

RMBG-2.0效果对比:同一张婚纱照,RMBG-2.0 vs Photoshop AI抠图细节

RMBG-2.0效果对比&#xff1a;同一张婚纱照&#xff0c;RMBG-2.0 vs Photoshop AI抠图细节 1. 引言&#xff1a;轻量级AI抠图工具的新选择 在图像处理领域&#xff0c;背景去除一直是个高频需求。传统方法要么需要专业软件操作&#xff0c;要么效果不尽如人意。今天我们要对比…

作者头像 李华
网站建设 2026/5/1 2:01:05

Ollama平台translategemma-12b-it保姆级使用教程

Ollama平台translategemma-12b-it保姆级使用教程 1. 你真的需要一个“能看懂图”的翻译模型吗&#xff1f; 先别急着拉滚动条——花30秒想想这几个真实场景&#xff1a; 你收到一封带产品说明书截图的英文邮件&#xff0c;但截图里全是小字号表格和标注箭头&#xff0c;OCR识…

作者头像 李华
网站建设 2026/5/1 7:28:33

Qwen3-TTS-12Hz-1.7B-CustomVoice实战教程:Prometheus+Grafana监控TTS服务指标

Qwen3-TTS-12Hz-1.7B-CustomVoice实战教程&#xff1a;PrometheusGrafana监控TTS服务指标 1. 引言 语音合成技术正在快速改变我们与数字世界的交互方式。Qwen3-TTS-12Hz-1.7B-CustomVoice作为新一代语音合成模型&#xff0c;支持10种主要语言和多种方言风格&#xff0c;为全球…

作者头像 李华
网站建设 2026/5/1 7:52:05

GLM-4-9B-Chat-1M多语言模型实战:手把手教你搭建智能对话系统

GLM-4-9B-Chat-1M多语言模型实战&#xff1a;手把手教你搭建智能对话系统 1. 为什么你需要一个支持100万字上下文的对话模型 你有没有遇到过这样的场景&#xff1a; 客户发来一份50页的产品需求文档&#xff0c;还附带3个技术白皮书和2份历史会议纪要&#xff0c;然后问&…

作者头像 李华
网站建设 2026/5/1 13:49:07

LFM2.5-1.2B-Thinking体验:内存不到1GB的惊艳文本生成

LFM2.5-1.2B-Thinking体验&#xff1a;内存不到1GB的惊艳文本生成 导语&#xff1a;你有没有试过在一台只有4GB内存的老笔记本上&#xff0c;不联网、不装显卡驱动&#xff0c;点开浏览器就能和一个真正“会思考”的AI聊天&#xff1f;LFM2.5-1.2B-Thinking做到了——它不是简…

作者头像 李华
网站建设 2026/5/1 3:44:03

OFA-VE实操手册:Gradio 6.0定制UI与透明化Log调试全解析

OFA-VE实操手册&#xff1a;Gradio 6.0定制UI与透明化Log调试全解析 1. 什么是OFA-VE&#xff1a;不只是视觉推理&#xff0c;更是一次人机交互体验升级 OFA-VE不是又一个跑通demo的模型包装工具。它是一个把“多模态理解能力”和“开发者友好性”真正拧在一起的实操系统——…

作者头像 李华