【Laravel】ファイルをstorageフォルダに保存する方法をわかりやすく解説!

スポンサーリンク

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/app/public/test.png に保存したファイルは、
  • http://your-domain.com/storage/test.png でアクセスできる、
    という仕組みです。

ファイル保存の基本: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');

このコードで保存されるファイルの実体は以下のようになります

  • 実体:storage/app/public/uploads/ファイル名
  • アクセスURL:http://your-domain.com/storage/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のstorageフォルダは、ログやキャッシュ、アップロードファイルなどを安全に保管するための非公開領域です。
  • Storageファサードを使うことで、簡単にファイルの保存・取得・削除が可能になります。
  • ファイルの保存方法としては、put()putFile()putFileAs()などのメソッドを状況に応じて使い分けます。
  • Web上からファイルにアクセスする場合は、storage/app/publicに保存し、php artisan storage:linkでシンボリックリンクを作成する必要があります。

Laravelのファイル保存機能は、非常に柔軟でありながら、直感的に使える設計になっています。正しく理解し、活用することで、より実用的で魅力的なWebアプリケーションを構築できることでしょう。

ぜひ、この記事の内容をプロジェクトに役立てていただければ幸いです。

Laravel
スポンサーリンク
なんくるをフォローする

コメント

タイトルとURLをコピーしました