运行 composer require league/flysystem 即可安装当前稳定版 v3.29.x,因主包会自动匹配 php 版本兼容的最新小版本,无需指定 ^3.0 或 v3;装错别名将报错或装错。

composer require league/flysystem 这条命令就能装上当前稳定版(v3.29.x),不需要加 ^3.0 或 v3——Packagist 上根本没这俩版本别名,硬写只会报错或装错。
为什么只运行这一条命令就够了
- Flysystem v3 的主包会自动选兼容你 PHP 版本的最新小版本:PHP 8.1+ → 装
^3.29,PHP 7.4 → 自动退到^3.20(最后一个支持 7.4 的版本) - 不要提前装适配器。核心包装完后先跑个本地读写验证通不通,再按需装对应驱动
- 如果项目里已有旧依赖(比如
aws/aws-sdk-php卡在 3.209.31),composer require会静默失败,而不是报错。这时得用composer why aws/aws-sdk-php查谁在拉冲突版本
Adapter 和 Filesystem 必须配对使用
常见错误是只 new 了适配器,却忘了传给 Filesystem 构造函数:
- ✅ 正确:
use League\Flysystem\Filesystem; use League\Flysystem\Local\LocalFilesystemAdapter;
$adapter = new LocalFilesystemAdapter('/var/www/uploads'); $filesystem = new Filesystem($adapter); // 这一步不能省! $filesystem->write('test.txt', 'ok');
-
❌ 错误:
$adapter = new LocalFilesystemAdapter('./uploads'); // 相对路径,Web 环境下 getcwd() 不稳定 // 没有 new Filesystem($adapter),直接调 $adapter->write(...) → TypeError 注意:
LocalFilesystemAdapter不是LocalAdapter(那是 v1),也不是Adapter(不存在)
要用什么存储,就单独装对应适配器
- 本地开发(推荐):
composer require league/flysystem-local(比原生LocalFilesystemAdapter更健壮,自带权限/符号链接处理) - AWS S3:
composer require league/flysystem-aws-s3-v3(不是flysystem-aws-s3,后者是 v2 旧版) - 阿里云 OSS:
composer require "iidestiny/flysystem-oss:^4" - GridFS(MongoDB):
composer require league/flysystem-gridfs - Google Cloud Storage:
composer require spatie/flysystem-google-cloud-storage
漏装适配器不会阻止 Filesystem 实例创建,但所有 write()、read() 都会抛 Unable to write file 类错误,且无明确提示——这是最常被忽略的静默失败点。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
跨存储操作不能靠 copy() 方法硬搬
$localFs->copy('a.txt', 's3://b.txt') 必然失败,因为 copy() 只支持同实例内路径(即协议前缀必须一致)。
真要跨源同步,得用 MountManager:
use League\Flysystem\MountManager;
<p>$manager = new MountManager([
'local' => $localFilesystem,
's3' => $s3Filesystem,
]);
$manager->copy('local://a.txt', 's3://b.txt');
</p>
key 名(如 local、s3)会成为协议前缀,后续路径必须带这个前缀,否则找不到挂载点。
路径必须是绝对路径,适配器初始化时传相对路径,在 CLI 下可能凑合能跑,Web 请求里因工作目录不可控,十有八九出问题。










