什么是 Flysystem,为什么需要它?
\n\nFlysystem 是一个强大的 PHP 库,为处理各种文件系统提供了统一、一致的接口。由 Frank de Jonge 开发,它解决了一个根本性问题:在实际项目中,代码往往与特定的文件系统(本地磁盘、FTP、Amazon S3、Dropbox 等)紧密耦合。如果将来需要将文件存储从本地服务器迁移到云存储,就必须重写大量代码。
\n\nFlysystem 抽象了这种复杂性。您只需编写一次代码,使用统一的 API,即可在不更改应用程序业务逻辑的情况下更换文件系统的“适配器”(驱动程序)。这使得您的代码:
\n- \n
- 灵活 — 轻松切换不同的存储方式。 \n
- 可测试 — 可以在测试中使用“虚拟”文件系统。 \n
- 可移植 — 代码在不同环境中运行一致。 \n
该库被用于许多知名项目,如 Laravel(作为存储磁盘的基础)、Symfony、Drupal 等。Flysystem 支持数十种适配器:Local、FTP/SFTP、Amazon S3、Google Cloud Storage、Azure Blob Storage、WebDAV、Dropbox,甚至加密和 Zip 归档。
\n\n安装
\n\nFlysystem 通过 Composer 安装。对于基本的本地文件系统操作,需要两个包:
\n\ncomposer require league/flysystem\ncomposer require league/flysystem-local\n\n重要提示: 从 3.x 版本开始,Flysystem 采用分离架构。主包 league/flysystem 仅包含接口和基础类。适配器(驱动程序)需要单独安装。这样可以根据实际需要只安装必要的组件。
其他文件系统的安装:
\n- \n
composer require league/flysystem-ftp— 用于 FTP/SFTP \n composer require league/flysystem-aws-s3-v3— 用于 Amazon S3 \n composer require league/flysystem-google-cloud-storage— 用于 Google Cloud \n composer require league/flysystem-memory— 用于测试(虚拟内存文件系统) \n
快速入门
\n\n创建一个简单示例:在本地磁盘上写入、读取和删除文件。
\n\n<?php\nrequire 'vendor/autoload.php';\n\nuse League\\Flysystem\\Filesystem;\nuse League\\Flysystem\\Local\\LocalFilesystemAdapter;\n\n// 1. 创建本地文件系统的适配器\n// 指定存储文件的根目录\n$adapter = new LocalFilesystemAdapter(__DIR__ . '/storage');\n\n// 2. 创建 Filesystem 实例\n$filesystem = new Filesystem($adapter);\n\n// 3. 写入文件\n$filesystem->write('hello.txt', '你好,世界!');\n\n// 4. 读取文件\n$content = $filesystem->read('hello.txt');\necho $content; // 输出:你好,世界!\n\n// 5. 检查文件是否存在\nif ($filesystem->fileExists('hello.txt')) {\n echo "文件存在!";\n}\n\n// 6. 删除文件\n$filesystem->delete('hello.txt');\n\n// 7. 检查文件是否已删除\necho $filesystem->fileExists('hello.txt') ? '存在' : '不存在'; // 输出:不存在\n?>\n\n请注意:我们没有使用 file_put_contents()、fopen() 或其他原生 PHP 函数。所有代码都通过统一的 Filesystem 接口运行。
主要方法/函数
\n\n下面介绍 Flysystem 的关键方法。所有示例均假设您已创建了 $filesystem 对象。
1. write() — 写入新文件
\n功能: 创建新文件或覆盖现有文件。
\n参数:
\n- \n
string $path— 文件路径 \n string|resource $contents— 文件内容(字符串或 \n