thinkphp5.0原生upload类不支持oss分片上传与断点续传,需弃用upload类,改用阿里云oss sdk配合前后端协同实现:前端切片、计算文件指纹、管理uploadid;后端通过initmultipartupload、uploadpart、completemultipartupload等接口完成分片上传与合并。

ThinkPHP5.0 原生 Upload 类不支持 OSS 分片上传与断点续传,它面向的是本地单文件上传(move_uploaded_file),最大只适配几 MB 到几十 MB 的小文件。要实现大文件(如 100MB+)在 TP5 中对接 OSS 的分片上传和断点续传,必须绕过原生 Upload 驱动,改用 OSS 官方 SDK + 前后端协同的分片逻辑。
核心改造思路:放弃 Upload 类,直连 OSS SDK
TP5 的 Upload 是基于 $_FILES 的同步接收模型,无法处理前端分片、uploadId 管理、ETag 校验等分片必需环节。正确路径是:
- 前端自行切片、生成文件指纹(如 MD5 或内容 Hash)、请求后端初始化 Multipart Upload
- 后端用
aliyun/oss-sdk-php调用initMultipartUpload,返回uploadId和objectKey - 前端并发上传 Part,每个请求携带
uploadId、partNumber、fileHash - 后端不保存临时文件,而是调用
uploadPart直传到 OSS;同时记录已成功上传的 Part 列表(存数据库或 Redis) - 前端调用“完成上传”时,后端调用
completeMultipartUpload合并
关键后端实现要点(TP5 控制器中)
需安装官方 SDK:composer require aliyuncs/oss-sdk-php
- OSS 初始化:配置 endpoint、accessKeyId、accessKeySecret、bucket,在控制器中 new Client
-
初始化接口(/upload/init):生成唯一
objectKey(建议含日期+UUID),调用$ossClient->initMultipartUpload($bucket, $objectKey),保存fileFingerprint → uploadId + objectKey + fileSize到数据库 -
上传 Part 接口(/upload/part):校验
fileFingerprint是否存在且状态为“进行中”,读取uploadId,调用uploadPart;成功后写入part_number和etag到 part_record 表 -
查询已传分片(/upload/check):前端上传前先查该
fileFingerprint对应哪些partNumber已存在,跳过重传 -
完成合并(/upload/complete):组装
CompleteMultipartUploadRequest,传入所有已上传 Part 的partNumber + etag列表,调用completeMultipartUpload
前端需配合的关键行为
不能依赖 TP5 的表单提交,必须用 JS(File API + fetch/Axios)控制全流程:
- 使用
file.slice(start, end)按固定大小(如 5MB)切片 - 计算全文件 MD5(可用 spark-md5 库),作为
fileFingerprint,用于断点识别 - 上传每个 Part 时,携带参数:
fileHash、uploadId、partNumber、objectKey - 失败时自动重试(最多 3 次),仅重传当前失败 Part,不影响其他
- 所有 Part 成功后,再发 complete 请求——此时 OSS 才真正生成可访问的完整文件
注意事项与避坑点
TP5 环境下特别容易忽略的细节:
- PHP 配置仍需调大:
upload_max_filesize=2M可保持默认(因不再走$_FILES),但post_max_size建议 ≥8M(用于传输元数据) - 禁用 TP5 的自动 input 过滤或 CSRF 验证(对 /upload/* 接口),避免分片请求被拦截
- 不要在控制器里用
$_FILES['chunk']接 Part 数据——应直接读取php://input(因为 Part 是 raw binary) - OSS 的 Part 大小不能小于 100KB,推荐设为 5MB~10MB;总分片数上限 10000,注意
partNumber从 1 开始 - 断点续传依赖服务端持久化 Part 状态,务必用数据库或 Redis 存储,不能只放内存或 session
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











