Laravelのバッチ(app/Console/Commands/)で外部から取得した画像ファイルを保存する

Laravel
スポンサーリンク

Laravelで画像を保存する場所、表示させる方法では保存場所はstorageがいいよ〜と書いた。

では、画像ファイルの保存はどうやるか?

を、
φ(..)メモ

やりたいこと

Laravelのバッチ(app/Console/Commands/)を使って、外部から取得した画像ファイルを保存したい。
保存先は、storage/ フォルダ。

やり方

ググると、Viewに画像アップロードフォームを設置して、
Controller側で$request->store を利用して画像保存するというもものがあったが、バッチだとどうするんだ?


ChatGPT3.5先生に聞いた以下の方法でうまくいった。

記述するファイルは、

app/Console/Commands/ 直下にあるバッチ用のスクリプトファイルです。

(参考:Laravelでバッチ用のファイルを作成する

  1. LaravelのStorageファサードとFileファサードをインポートします。
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\File;
  1. バッチのhandleメソッド内で、画像ファイルを取得し保存するロジックを実装します。
public function handle()
{
    // 画像を取得するロジックを実装します
    $imageUrl = 'https://example.com/image.jpg';
    $imageData = file_get_contents($imageUrl);

    // ファイル名を生成します
    $filename = 'image.jpg';

    // ファイルを保存するパスを指定します
    $path = 'images/';

    // ファイルをディスクに保存します
    Storage::disk('public')->put($path.$filename, $imageData);

    // 保存されたファイルのパスを取得します
    $filePath = Storage::disk('public')->path($path.$filename);

    // データベースにファイルのパスを保存するロジックを実装します
    // ここでデータベースにファイルのパスを保存する処理を実装します

    $this->info('Image fetched and saved successfully.');
}

ちゃんとDBに登録することも考えてファイルのパスも取得してますな。
保存する前にPathはわかってるはずだからPath取得し直さなくてもいい気もするけど。

上記のコードでは、file_get_contents関数を使用して画像ファイルのデータを取得し、Storageファサードを使用してファイルを指定したディスクに保存しています。disk(‘public’)メソッドは、config/filesystems.phpファイルで定義されているディスクを指定するものです。

また、pathメソッドを使用することで保存されたファイルのフルパスを取得できます。データベースへの保存のロジックは省略していますが、ここにはデータベースにファイルのパスを保存する処理を実装してください。

DBへの保存は後日メモしよう。。

このようにして、storeメソッドの代わりにStorageファサードを使用してファイルを保存することができます。

他にやり方ありそうだが、バッチだと、Storageファサードを使うんだね!

コメント