文件存储
简介
Laravel 提供了一个强大的文件系统抽象,这要感谢 Frank de Jonge 的 Flysystem PHP 包。Laravel 的 Flysystem 集成提供了 简单的驱动来处理本地文件系统、SFTP 和 Amazon S3。更棒的是,在你的本地开发机器和生产服务器之间切换这些存储选项是非常简单的,因为每个系统的 API 都是一样的。
配置
Laravel 的文件系统配置文件位于 config/filesystems.php
。 在这个文件中,你可以配置你所有的文件系统「磁盘」。每个磁盘代表一个特定的存储驱动器和存储位置。 每种支持的驱动器的配置示例都包含在配置文件中, 因此你可以修改配置以反映你的存储偏好和证书。
local
驱动用于与运行Laravel应用程序的服务器上存储的文件进行交互,而 s3
驱动用于写入 Amazon 的 S3 云存储服务。
你可以配置任意数量的磁盘,甚至可以添加多个使用相同驱动的磁盘。
本地驱动
使用 local
驱动时,所有文件操作都与 filesystems
配置文件中定义的 root
目录相关。 默认情况下,此值设置为 storage/app
目录。因此,以下方法会把文件存储在 storage/app/example.txt
中:
use Illuminate\Support\Facades\Storage;
Storage::disk('local')->put('example.txt', 'Contents');
公共磁盘
在 filesystems
配置文件中定义的 public
磁盘适用于要公开访问的文件。默认情况下, public
磁盘使用 local
驱动,并且将这些文件存储在 storage/app/public
目录下。
要使这些文件可从 web 访问,应创建从 public/storage
到 storage/app/public
的符号链接。这种方式能把可公开访问文件都保留在同一个目录下,以便在使用零停机时间部署系统如 Envoyer 的时候,就可以轻松地在不同的部署之间共享这些文件。
你可以使用 Artisan 命令 storage:link
来创建符号链接:
php artisan storage:link
一旦一个文件被存储并且已经创建了符号链接,你就可以使用辅助函数 asset
来创建文件的 URL:
echo asset('storage/file.txt');
你可以在 filesystems
配置文件中配置额外的符号链接。这些链接将会在运行 storage:link
命令时自动创建:
'links' => [
public_path('storage') => storage_path('app/public'),
public_path('images') => storage_path('app/images'),
],
驱动先决要求
S3 驱动配置
在使用 S3 驱动之前,你需要通过 Composer 包管理器安装 Flysystem S3 软件包:
composer require league/flysystem-aws-s3-v3 "^3.0"
S3 驱动配置信息位于你的 config/filesystems.php
配置文件中。该文件包含一个 S3 驱动的示例配置数组。你可以自由使用自己的 S3 配置和凭证修改此数组。为方便起见,这些环境变量与 AWS CLI 使用的命名约定相匹配。
FTP 驱动配置
在使用 FTP 驱动之前,你需要通过 Composer 包管理器安装 Flysystem FTP 包:
composer require league/flysystem-ftp "^3.0"
Laravel 的 Flysystem 能与 FTP 很好的适配;然而,框架的默认 filesystems.php
配置文件中并未包含示例配置。如果你需要配置 FTP 文件系统,可以使用下面的配置示例:
'ftp' => [
'driver' => 'ftp',
'host' => env('FTP_HOST'),
'username' => env('FTP_USERNAME'),
'password' => env('FTP_PASSWORD'),
// 可选的 FTP 设置...
// 'port' => env('FTP_PORT', 21),
// 'root' => env('FTP_ROOT'),
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],
SFTP 驱动配置
在使 用 SFTP 驱动之前,你需要通过 Composer 包管理器安装 Flysystem SFTP 软件包。
composer require league/flysystem-sftp-v3 "^3.0"
Laravel 的 Flysystem 能与 SFTP 很好的适配;然而,框架默认的 filesystems.php
配置文件中并未包含示例配置。如果你需要配置 SFTP 文件系统,可以使用下面的配置示例:
'sftp' => [
'driver' => 'sftp',
'host' => env('SFTP_HOST'),
// 基本认证的设置...
'username' => env('SFTP_USERNAME'),
'password' => env('SFTP_PASSWORD'),
// 基于SSH密钥的认证与加密密码的设置...
'privateKey' => env('SFTP_PRIVATE_KEY'),
'passphrase' => env('SFTP_PASSPHRASE'),
// 可选的SFTP设置...
// 'hostFingerprint' => env('SFTP_HOST_FINGERPRINT'),
// 'maxTries' => 4,
// 'passphrase' => env('SFTP_PASSPHRASE'),
// 'port' => env('SFTP_PORT', 22),
// 'root' => env('SFTP_ROOT', ''),
// 'timeout' => 30,
// 'useAgent' => true,
],
驱动先决条件
S3 驱动配置
在使用 S3 驱动之前,你需要通过 Composer 安装 Flysystem S3 包:
composer require league/flysystem-aws-s3-v3 "^3.0"
S3 驱动配置信息位于你的 config/filesystems.php
配置文件中。 此文件包含 S3 驱动的示例配置数组。 你可以使用自己的 S3 配置和凭据自由修改此数组。 为方便起见,这些环境变量与 AWS CLI 使用的命名约定相匹配。
FTP 驱动配置
在使用 FTP 驱动之前,你需要通过 Composer 安装 Flysystem FTP 包:
composer require league/flysystem-ftp "^3.0"
Laravel 的 Flysystem 集成与 FTP 配合得很好; 但是,框架的默认 filesystems.php
配置文件中不包含示例配置。 如果需要配置 FTP 文件系统,可以使用下面的配置示例:
'ftp' => [
'driver' => 'ftp',
'host' => env('FTP_HOST'),
'username' => env('FTP_USERNAME'),
'password' => env('FTP_PASSWORD'),
// 可选的 FTP 设置...
// 'port' => env('FTP_PORT', 21),
// 'root' => env('FTP_ROOT'),
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],