LaravelのStorageの使い方!(ファイルの保存・取得・削除など)

Laravel Laravel

LaravelのStorageファサードを使用して、ファイルを保存する方法を書いています。
前回はRequestクラスを使用して、単純にアップロードする方法を書きました。

今回はStorageファサードを使用して、ファイルをローカルのstorage/app配下に保存します。
また保存したファイルの取得・削除方法など、Storageファサードで使いそうなメソッドについてまとめています。

SFTPやAmazonS3など、外部のストレージを使うことも可能ですが、今回はローカルファイルシステムで使ってみました。
サンプルコードの検証にはLaravelの8を使っています。

ファイルを保存する

Storageファサードを使用して、アップロードする場合にはStorageファサードのputメソッドを使用します。
Storageファサードを使用するときは、Illuminate\Support\Facades\Storageuse文で読み込むようにしておきます。

Storageのテスト用にStorageControllerというコントローラーを作成しました。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class StorageController extends Controller
{
    public function put(Request $request) {
        if (is_null($request->image_base64_text)) {
            return response()->json('base64の画像テキストが指定されていません。');
        }

        $image = base64_decode($request->image_base64_text);
        Storage::put('sushi.png', $image);
    }
}

APIとして、base64形式で画像を受け取って保存します。
base64_decodeで取得したテキストを画像に変換しています。

画像の保存するときにStorageファサードを使用しています。

Storage::put('sushi.png', $image);

このようにすることで、第1引数に指定したパス名で、第2引数のデータが保存されます。
デフォルトでstorage/app配下に保存されるので、storage/app/sushi.pngとなります。

動作確認

Postmanでこのようにリクエストを飛ばしてみます。
Laravelにbase64で画像のアップロードテスト

そうすると、下記のようにstorage/app配下に保存されました。
Laravelに画像のアップロード後

ファイルをディレクトリを指定して保存する

次はディレクトリを指定して、保存したい場合です。
下記のようにputメソッドの第1引数にスラッシュ(/)で区切ってディレクトリとファイル名を書きます。

Storage::put('images/sushi.png', $image);

これでstorage/app/images/sushi.pngにファイルが配置されます。
さらに階層を深くしたい場合には、スラッシュ区切りを増やしていくと良いです。

何らかのIDを挟んで、アップロードしたい場合は下記のように、変数で動的に設定してアップロードします。

Storage::put("images/{$id}/sushi.png", $image);

$idが5だった場合は、storage/app/images/5/sushi.pngにファイルが配置されます。

ファイルを取得する

ファイルを取得したい場合は、Storagegetメソッドを使用します。
作成したStorageControllerクラスにfetchメソッドを追加しました。

public function fetch() {
    $image = Storage::get('sushi.png');

    $imageText = base64_encode($image);
    return response()->json($imageText);
}

Storageクラスのgetメソッドを使用して、storage/app配下のファイルパスを指定すると、ファイルが返ってきます。
今回は返ってきたファイルをbase64形式でエンコードし直して、文字列として返すようにしました。

ディレクトリのファイルを取得する

保存した時と同じようにstorage/app配下のパスをgetメソッドで指定すると返ってきます。
storage/app/images/sushi.pngの場合は、下記のように指定します。

Storage::get('images/sushi.png');

ファイルを削除する

ファイルを削除したい場合は、Storagedeleteメソッドを使用します。
storage/app/sushi.pngファイルを削除する場合は、下記のようにstorage/app配下のパスを指定します。

Storage::delete('sushi.png');

ディレクトリを削除する

ディレクトリをdeleteDirectoryメソッドを使用して指定すると、ディレクトリごと削除されます。
storage/app/images配下にファイルやディレクトリが配置されていて、一括で削除する場合には下記のように指定します。

Storage::deleteDirectory('images');

ファイルのMimeTypeを取得する

ファイルのMimeタイプを取得したい場合にはmimeTypeメソッドを使用します。
ファイルのパスを渡すと、Mimeタイプが返ってきます。

Storage::mimeType('sushi.png');

sushi.pngpng形式の画像ファイルです。
この場合に返ってくる文字列は「image/png」になります。

コメント

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