🦁

LaravelのStorageとpublicディレクトリの違い

に公開

LaravelのStorageとpublicディレクトリの違いについてまとめた記事です。

自分としてはpublicにアクセスすると内部で勝手にStorageにアクセスしているかと思っていました。
ですが、どうも違うようです。

1. public ディレクトリとは?

public/ は、Webブラウザから直接アクセスできる唯一のディレクトリです。たとえば、CSSファイル、JavaScriptファイル、画像などのフロントエンド用リソースを置く場所です。

特徴

URLから直接アクセスできる(例: /images/logo.png)
表に出しても良いものを置く
Laravelのエントリーポイントである index.php もここにある

注意点

セキュリティ的に、機密性の高いファイルは絶対に置かない

2. storage ディレクトリとは?

storage/ は、アプリケーション内部で使用するファイルを保管する場所です。ユーザーがアップロードした画像や、ログファイル、キャッシュファイルなどがここに保存されます。

特徴

通常は外部から直接アクセスできない
storage/app/public/ の中に保存して、php artisan storage:link で public/storage にシンボリックリンクを作ることで公開可能

注意点

storage/app 以下は、そのままではWebからアクセスできないため、画像などを見せたいときはリンクが必要

3. 公開用ファイルの保存:どうすればいい?

例えば、ユーザーがアップロードした画像をWebページに表示したい場合、以下のような手順で保存と表示を行います。

ステップ①: 画像を保存

$path = $request->file('image')->store('material_images', 'public');
このとき、ファイルは storage/app/public/material_images/ に保存されます。

ステップ②: シンボリックリンクの作成(初回のみ)

php artisan storage:link
これで public/storage から storage/app/public にアクセスできるようになります。

ステップ③: 画像のURLを生成

$imageUrl = asset('storage/' . $path);
これでブラウザから画像を表示できるURLが生成されます。

4. まとめ

見せたいファイル → storage/app/public に保存+storage:linkで公開

見せたくないファイル → storage/ 以下に保管し、直接アクセスさせない

Laravelで画像やファイルを扱う際には、public と storage の役割を正しく理解して、セキュアで保守運用生の高いものにしたいですね。

Discussion