LaravelでWebアプリケーションを開発していると、ユーザーからアップロードされたファイルを保存したい場面がよくあります。たとえば、プロフィール画像やドキュメントファイルなど、扱うデータはさまざまです。
こうしたファイルの保存先として、多くの場合に活用されるのが、Laravelのstorage
フォルダです。
しかし、初めてLaravelに触れる方にとっては、「どこに保存されるの?」「保存したファイルにどうやってアクセスするの?」といった疑問を持たれることも少なくありません。
そこで本記事では、Laravelにおけるstorage
フォルダへのファイル保存について、基本的な使い方から実践的なコード例まで、段階を追って丁寧に解説します!
Laravelのstorageフォルダとは?
Laravelのプロジェクト内には、storage
という名前のディレクトリが用意されております。このフォルダは、一時ファイルやログファイル、キャッシュデータ、そしてアップロードされたファイルなどを保存するための領域です。
特にファイルアップロードに関しては、storage/app
の中が主な保存場所となります。たとえば、Storage::put('example.txt', '内容');
といったコードを実行すると、storage/app/example.txt
にファイルが保存されます。
ただし、このままでは保存されたファイルにWebブラウザから直接アクセスすることはできません。なぜなら、storage
ディレクトリは公開領域(public)ではないためです。
Laravelでは、storage/app/public
という特別なディレクトリが用意されており、ここに保存されたファイルを公開する仕組みがあります。この仕組みを有効にするために使用するのが、以下のArtisanコマンドです。
php artisan storage:link
このコマンドを実行することで、public/storage
というシンボリックリンク(ショートカットのようなもの)が作成され、storage/app/public
にあるファイルへWeb上からアクセスできるようになります。
つまり、
ファイル保存の基本:Storageファサードの使い方
Laravelでファイルを保存する際に、もっともよく使われるのがStorage
ファサードです。Laravelのファサードとは、複雑なクラスの機能を簡潔に呼び出せる仕組みのこと。Storage
を使えば、ファイルの保存・取得・削除などが驚くほど簡単に扱えます。
まず、コントローラなどでStorage
を使うために、以下のようにuse
宣言を忘れずに記述しましょう。
use Illuminate\Support\Facades\Storage;
よく使う保存メソッド
Laravelにはいくつかの保存メソッドがあります。それぞれの用途を簡単にご紹介いたします。
put()
文字列やバイナリデータをそのままファイルに保存します。
Storage::put('example.txt', 'こんにちは、Laravel!');
このコードは、storage/app/example.txt
にテキストファイルを作成し、その中に「こんにちは、Laravel!」と書き込みます。
putFile()
アップロードされたファイル(インスタンス)を保存する場合に使います。Laravelが自動的にファイル名をユニークなものにしてくれます。
Storage::putFile('uploads', $request->file('upload_file'));
この場合、ファイルはstorage/app/uploads
に保存され、ランダムなファイル名が割り当てられます。
putFileAs()
アップロードされたファイルを指定したファイル名で保存したい場合はこちら。
Storage::putFileAs('uploads', $request->file('upload_file'), 'myfile.jpg');
保存場所はstorage/app/uploads/myfile.jpg
となります。
実際に保存してみよう(コード例)
ここからは、Laravelでファイルを実際にアップロードし、storage
フォルダへ保存するまでの流れを具体的に見ていきましょう。
フォームからファイルをアップロード
まずは、ユーザーがファイルを選択して送信できるように、シンプルなアップロードフォームを用意します。resources/views/upload.blade.php
に以下のように記述してください。
<form action="{{ route('upload') }}" method="POST" enctype="multipart/form-data">
@csrf
<input type="file" name="upload_file">
<button type="submit">アップロード</button>
</form>
enctype="multipart/form-data"
を忘れるとファイルが送信されませんので、注意が必要です。
コントローラで受け取って保存
次に、アップロードされたファイルをコントローラで受け取り、storage
フォルダに保存します。
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
public function upload(Request $request)
{
// ファイルが送信されているか確認
if ($request->hasFile('upload_file')) {
// ファイルを「uploads」ディレクトリに保存
$path = $request->file('upload_file')->store('uploads');
return "ファイルを保存しました:{$path}";
}
return "ファイルが選択されていません。";
}
このコードでは、storage/app/uploads
の中にファイルが保存され、ファイル名はLaravelが自動でランダムに生成してくれます。
保存先とファイル名を指定したい場合
ファイル名を指定して保存したい場合は、storeAs()
メソッドを使用します。
$request->file('upload_file')->storeAs('uploads', 'my_upload.jpg');
これにより、ファイルはstorage/app/uploads/my_upload.jpg
として保存されます。
保存したファイルにアクセスするには?
ファイルをstorage
フォルダに保存しただけでは、そのままWebブラウザからアクセスすることはできません。Laravelではセキュリティの観点から、storage
ディレクトリは公開されていない領域に設定されているためです。
しかし、storage/app/public
という特別なディレクトリを使えば、保存したファイルをWeb上から安全に公開することができます。
ステップ1:storage:link コマンドを実行
まず、Laravelのartisan
コマンドを使って、シンボリックリンクを作成します。
php artisan storage:link
このコマンドを実行すると、public/storage
というリンクが作成されます。これにより、storage/app/public
内のファイルへ、public/storage
経由でアクセスできるようになります。
ステップ2:ファイルをpublicディスクに保存する
ファイルを公開ディレクトリに保存したい場合は、store('public')
のように記述します。
$path = $request->file('upload_file')->store('public/uploads');
このコードで保存されるファイルの実体は以下のようになります
ステップ3:URLを生成する方法
保存したファイルのURLを取得するには、Storage::url()
メソッドを使うと便利です。
$url = Storage::url('public/uploads/my_upload.jpg');
このコードの出力は以下のようになります。
/storage/uploads/my_upload.jpg
つまり、最終的にWeb上からアクセス可能なURLはこうなります。
http://your-domain.com/storage/uploads/my_upload.jpg
まとめ
本記事では、Laravelでファイルをstorage
フォルダに保存する基本的な方法から、Web上での公開手順までを順を追ってご紹介いたしました。
ポイントを振り返ってみましょう:
Laravelのファイル保存機能は、非常に柔軟でありながら、直感的に使える設計になっています。正しく理解し、活用することで、より実用的で魅力的なWebアプリケーションを構築できることでしょう。
ぜひ、この記事の内容をプロジェクトに役立てていただければ幸いです。
コメント