什么是文件存储
Laravel 基于 Flysystem 这一 PHP 扩展,提供了一层强大的文件系统抽象。 本地磁盘、SFTP、Amazon S3 等不同的存储后端都可以通过相同的 API 操作,因此在不同环境间切换时无需修改代码。即便更换驱动,代码也不用改。开发用本地磁盘、生产用 S3 的组合可以轻松实现。
配置
文件系统的配置集中在config/filesystems.php 中。
你可以在这里定义“磁盘(disk)”,也就是一组“驱动 + 存储位置”的组合。
主要驱动如下:
local 驱动
使用local 驱动时,操作会以 filesystems 中配置的 root 目录为基准。
默认情况下 root 是 storage/app/private。
修改默认磁盘
可以通过FILESYSTEM_DISK 环境变量切换默认磁盘。
public 磁盘与符号链接
public 磁盘用于存放需要通过 Web 访问的文件。
默认会保存到 storage/app/public 目录。
要让 Web 服务器可以访问,需要从 public/storage 建立到 storage/app/public 的符号链接。
1
创建符号链接
2
获取文件 URL
创建符号链接后,可以用
asset 辅助函数生成 URL。storage:unlink。
Storage Facade 的基本操作
读取文件
写入文件
put 失败时默认返回 false。
可以在磁盘配置中设置 'throw' => true 来改为抛出异常。删除文件
文件下载响应
生成 URL
普通 URL
local 驱动会返回类似 /storage/file.jpg 的相对 URL。
s3 驱动会返回完整的远程 URL。
临时 URL(Temporary URL)
要生成带有有效期的 URL,可以使用temporaryUrl 方法。
local 与 s3 驱动都支持。
文件上传
以下是保存用户表单上传文件的常见模式。store 方法(自动生成文件名)
storeAs 方法(指定文件名)
指定磁盘上传
通过 Storage Facade 上传
文件可见性(Visibility)
Flysystem 通过visibility 管理文件的公开/私有状态。
storePublicly。
使用多个磁盘
通过disk 方法可以切换要操作的磁盘。
云存储(S3)配置
安装扩展包
环境变量配置
在.env 中配置 S3 的凭证信息。
DigitalOcean Spaces、Cloudflare R2、Vultr Object Storage 等兼容 S3 的服务也可以使用
s3 驱动。
在 endpoint 选项中指定服务的 endpoint URL 即可。获取文件元数据
目录操作
测试
使用Storage::fake() 可以在不触碰真实磁盘的情况下编写文件操作的测试。
使用
UploadedFile::fake()->image() 需要 PHP 的 GD 扩展。实战示例:头像上传
下面是一个综合了校验、保存、路径写入数据库的实战控制器示例。Storage::url() 获取 URL。