ファイルストレージとは
Laravelは Flysystem というPHPパッケージをベースにした、強力なファイルシステム抽象化レイヤーを提供しています。 ローカルディスク・SFTP・Amazon S3など、異なるストレージバックエンドを同じAPIで操作できるため、環境に応じて切り替えてもコードの変更が不要です。ドライバーを切り替えてもコードは変わりません。開発環境ではローカル、本番環境ではS3、という構成が簡単に実現できます。
設定
ファイルシステムの設定はconfig/filesystems.php にまとめられています。
ここで「ディスク」を定義します。ディスクとは、特定のドライバーとストレージ場所の組み合わせです。
主なドライバーは次のとおりです。
localドライバー
local ドライバーを使うと、filesystems 設定の root ディレクトリを基準にファイルを操作します。
デフォルトでは storage/app/private が root です。
デフォルトディスクの変更
FILESYSTEM_DISK 環境変数でデフォルトのディスクを切り替えられます。
publicディスクとシンボリックリンク
public ディスクはWebからアクセスできるファイルを置くためのものです。
デフォルトでは storage/app/public ディレクトリに保存されます。
Webサーバーからアクセスできるようにするには、public/storage から storage/app/public へのシンボリックリンクを作成します。
1
シンボリックリンクの作成
2
ファイルのURLを取得
シンボリックリンク作成後、
asset ヘルパーでURLを生成できます。storage:unlink を使います。
Storageファサードの基本操作
ファイルの読み込み
ファイルの書き込み
put が失敗した場合、デフォルトでは false を返します。
ディスク設定で 'throw' => true とすることで、例外をスローさせることもできます。ファイルの削除
ファイルのダウンロードレスポンス
URLの生成
通常のURL
local ドライバーでは /storage/file.jpg のような相対URLを返します。
s3 ドライバーでは完全なリモートURLを返します。
一時URL(Temporary URL)
期限付きのURLを生成したい場合はtemporaryUrl メソッドを使います。
local と s3 ドライバーで利用できます。
ファイルのアップロード
ユーザーがフォームからアップロードしたファイルを保存する一般的なパターンです。storeメソッド(ファイル名を自動生成)
storeAsメソッド(ファイル名を指定)
ディスクを指定してアップロード
Storageファサード経由でアップロード
ファイルの可視性(Visibility)
Flysystemでは、ファイルの公開・非公開をvisibility で管理します。
storePublicly を使います。
複数ディスクの使い分け
disk メソッドで操作するディスクを切り替えられます。
クラウドストレージ(S3)の設定
パッケージのインストール
環境変数の設定
.env ファイルにS3の認証情報を設定します。
DigitalOcean Spaces、Cloudflare R2、Vultr Object StorageなどのS3互換サービスも
s3 ドライバーで利用できます。
endpoint オプションにサービスのエンドポイントURLを指定してください。ファイルメタデータの取得
ディレクトリ操作
テスト
Storage::fake() を使うと、実際のディスクに触れることなくファイル操作のテストが書けます。
UploadedFile::fake()->image() を使うには、PHPの GD拡張 が必要です。実践的なユースケース: プロフィール画像のアップロード
バリデーション・保存・DBへのパス記録を組み合わせた実践的なコントローラーの例です。Storage::url() を使ってURLを取得します。