Skip to main content

ファイルストレージとは

Laravelは Flysystem というPHPパッケージをベースにした、強力なファイルシステム抽象化レイヤーを提供しています。 ローカルディスク・SFTP・Amazon S3など、異なるストレージバックエンドを同じAPIで操作できるため、環境に応じて切り替えてもコードの変更が不要です。
ドライバーを切り替えてもコードは変わりません。開発環境ではローカル、本番環境ではS3、という構成が簡単に実現できます。

設定

ファイルシステムの設定は config/filesystems.php にまとめられています。 ここで「ディスク」を定義します。ディスクとは、特定のドライバーとストレージ場所の組み合わせです。 主なドライバーは次のとおりです。

localドライバー

local ドライバーを使うと、filesystems 設定の root ディレクトリを基準にファイルを操作します。 デフォルトでは storage/app/privateroot です。

デフォルトディスクの変更

FILESYSTEM_DISK 環境変数でデフォルトのディスクを切り替えられます。

publicディスクとシンボリックリンク

public ディスクはWebからアクセスできるファイルを置くためのものです。 デフォルトでは storage/app/public ディレクトリに保存されます。 Webサーバーからアクセスできるようにするには、public/storage から storage/app/public へのシンボリックリンクを作成します。
1

シンボリックリンクの作成

2

ファイルのURLを取得

シンボリックリンク作成後、asset ヘルパーでURLを生成できます。
追加のシンボリックリンクが必要な場合、config/filesystems.phplinks 配列で設定できます。
シンボリックリンクを削除するには storage:unlink を使います。

Storageファサードの基本操作

ファイルの読み込み

ファイルの書き込み

put が失敗した場合、デフォルトでは false を返します。 ディスク設定で 'throw' => true とすることで、例外をスローさせることもできます。

ファイルの削除

ファイルのダウンロードレスポンス

URLの生成

通常のURL

local ドライバーでは /storage/file.jpg のような相対URLを返します。 s3 ドライバーでは完全なリモートURLを返します。

一時URL(Temporary URL)

期限付きのURLを生成したい場合は temporaryUrl メソッドを使います。 locals3 ドライバーで利用できます。
S3では追加のリクエストパラメータも指定できます。
一時アップロードURLが必要な場合は temporaryUploadUrl メソッドを使います。 クライアントサイドから直接S3へアップロードするようなサーバーレス構成で活用できます。

ファイルのアップロード

ユーザーがフォームからアップロードしたファイルを保存する一般的なパターンです。

storeメソッド(ファイル名を自動生成)

storeAsメソッド(ファイル名を指定)

ディスクを指定してアップロード

Storageファサード経由でアップロード

getClientOriginalName()getClientOriginalExtension() はユーザーが改ざんできるため安全ではありません。 ファイル名には hashName()、拡張子には extension() を使ってください。

ファイルの可視性(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を取得します。
最終更新日 2026年3月29日