thinkphp 6.x 不支持原生阿里云 oss 驱动,推荐使用 overtrue/flysystem-oss:需通过 composer 安装,配置 disk 时指定 access_key、secret_key、bucket、带 https:// 的 endpoint 等参数,并确保 .env 中正确设置环境变量。

ThinkPHP 上传驱动怎么对接阿里云 OSS
直接说结论:ThinkPHP 6.x 的 Filesystem 不支持原生 OSS 驱动,必须通过 league/flysystem-aws-s3-v3 或兼容 S3 协议的封装包间接接入,但阿里云 OSS 并非标准 S3,需额外处理签名和 endpoint 差异。
为什么不能直接用 flysystem-aws-s3-v3
这个包默认走 AWS S3 v4 签名 + 标准 region 路由,而阿里云 OSS 使用自定义域名、oss-cn-hangzhou.aliyuncs.com 类似格式的 endpoint,且部分区域不支持 v4 签名(如早期杭州、上海),容易报 InvalidAccessKeyId 或 SignatureDoesNotMatch。
- 必须显式设置
use_path_style_endpoint => true,否则生成的 URL 是bucket.endpoint形式,OSS 不认 -
region参数不能填 AWS 风格(如cn-hangzhou),得填空字符串或oss-cn-hangzhou(取决于 SDK 版本) - 推荐改用
aliyuncs/oss-sdk-php自研适配器,或社区维护的overtrue/flysystem-oss
用 overtrue/flysystem-oss 配置自定义磁盘
这是目前最省心的方案,它专为阿里云 OSS 封装,自动处理 endpoint、签名、ACL、目录分隔符等细节,和 ThinkPHP Filesystem 无缝对接。
- 执行
composer require overtrue/flysystem-oss - 在
config/filesystems.php的disks数组里加一项:
'oss' => [
'driver' => 'oss',
'access_key' => env('ALIYUN_OSS_ACCESS_KEY', ''),
'secret_key' => env('ALIYUN_OSS_SECRET_KEY', ''),
'bucket' => env('ALIYUN_OSS_BUCKET', ''),
'endpoint' => env('ALIYUN_OSS_ENDPOINT', 'https://oss-cn-hangzhou.aliyuncs.com'),
'timeout' => 3600,
'connect_timeout' => 10,
'is_cname' => false,
],
-
endpoint必须带https://,否则初始化失败;若用了 CNAME 域名(如https://cdn.example.com),则is_cname设为true - 环境变量要实际写进
.env,别只改配置文件——TP 默认只读.env
上传时指定磁盘失败的常见原因
调 think\Filesystem::disk('oss')->put(...) 报错,大概率不是代码问题,而是权限或网络卡点。
- OSS Bucket 的读写权限设成了私有,但没配好 STS 临时 token —— 普通上传必须开「公共读」或用 RAM 子账号+策略授权
oss:PutObject - 服务器时间偏差超过 15 分钟,OSS 拒绝签名请求,错误信息是
RequestExpired,用ntpdate -u ntp.aliyun.com校时 - ThinkPHP 的
Filesystem默认对路径做ltrim($path, '/'),如果传了/avatar/1.jpg,实际存到 OSS 是avatar/1.jpg—— 别依赖开头斜杠,统一用相对路径
真正麻烦的是跨区域复制、大文件分片上传、回调通知这些,基础上传配对 endpoint 和密钥就跑起来了,但 endpoint 写错一个字符,错误信息就只会提示 Connection refused,看不出是 DNS 还是协议问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










