thinkphp 6.x 借助 flysystem 实现本地与云端存储统一管理,通过配置多磁盘(local/qiniu/s3)、显式指定 disk 名称调用 put/get/delete 方法,结合 mountmanager 实现跨存储协同。

ThinkPHP 6.x 借助 Flysystem 实现本地与云端存储的统一管理,核心在于“一套接口、多套后端”——你用相同的 put()、get()、delete() 方法操作文件,底层自动适配本地磁盘、七牛云、AWS S3 或阿里云 OSS 等不同存储系统。关键不是重写业务逻辑,而是配对驱动、注入适配器、按需切换磁盘。
配置多个磁盘,按用途划分存储位置
在 config/filesystem.php 的 disks 数组中定义不同存储目标,每个磁盘对应一种物理后端:
-
本地开发用
local:适合调试,路径设为runtime/storage或public/uploads,无需密钥 -
正式环境用
qiniu:需安装overtrue/flysystem-qiniu,配置accessKey、secretKey、bucket和region(如z1) -
国际业务用
s3:依赖league/flysystem-aws-s3-v3和aws/aws-sdk-php,type必须写成AwsS3V3(大小写敏感) -
默认磁盘可动态切换:通过
.env设置FILESYSTEM_DRIVER=qiniu,避免硬编码
上传逻辑不改,只换 disk 名称
业务代码保持简洁,上传时显式指定磁盘即可,无需条件判断或 if 分支:
- 存到七牛:
\think\facade\Filesystem::disk('qiniu')->put('avatar/'.$uid.'.jpg', $content) - 存到 S3:
\think\facade\Filesystem::disk('s3')->put('logs/'.date('Y-m-d').'.log', $logData) - 存到本地(覆盖默认):
\think\facade\Filesystem::put('temp/cache.bin', $data)
注意:上传前建议先调用 $file->getRealPath() 获取真实临时路径,避免 Swoole 或 OPcache 环境下 getPathname() 返回不可读路径。
驱动注册要到位,尤其非内置类型
ThinkPHP 6 原生支持 local、ftp 等驱动,但七牛、AWS S3 V3 等需手动绑定适配器类:
-
七牛云:安装
overtrue/flysystem-qiniu后,框架能自动识别type => 'qiniu',无需额外服务提供者 -
AWS S3 V3:必须创建自定义服务提供者(如
app/provider/AwsS3V3Provider.php),在register()中绑定AwsS3V3Adapter到 Flysystem Manager - 验证是否生效:执行
\think\facade\Filesystem::disk('s3')->write('test.txt', 'ok'),成功即连通
跨存储协同,用 MountManager 统一调度
当需要把头像从本地同步到七牛、或把日志从 S3 拉取到本地分析时,可引入 Flysystem 的 MountManager:
- 实例化多个
Filesystem对象(分别对应local、qiniu、s3) - 传入关联数组给
new MountManager(['local' => $localFs, 'qiniu' => $qiniuFs]) - 直接执行
$manager->copy('local://avatar/1.jpg', 'qiniu://avatar/1.jpg'),无需手动读写中转
这种方式让多源文件流转变得像复制粘贴一样直观,适合定时同步、备份归档等场景。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











