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