【Laravel】S3にbase64エンコードされた画像をアップロードする

えび

LaravelS3バケットを使用して画像を保存する際に
base64エンコードされた文字列画像をアップしたかった

保存したいbase64エンコード画像とは

下記のように、文字列にエンコードされたもの

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA88AAAFFCAY.......

このままデータベースに保存すると、
容量が大きい画像はサイト&DBがめちゃんこ重くなるので、S3に逃す対応をした

S3に保存するコード

  • FileService.php
    /**
     * @param $base64File
     * @return string
     */
    public function uploadBase64ToS3($base64File)
    {
        // "data:{拡張子}"と"base64,"で区切る
        list($fileInfo, $fileData) = explode(';', $base64File);
        // 拡張子を取得
        $extension = explode('/', $fileInfo)[1];
        // $fileDataにある"base64,"を削除する
        list(, $fileData) = explode(',', $fileData);
        // base64をデコード
        $fileData = base64_decode($fileData);
        // ランダムなファイル名生成
        $fileName = md5(uniqid(rand(), true)). ".$extension";
        // AWS S3 に保存する
        Storage::disk('s3')->put($fileName, $fileData, 'public');
        // データベースに保存するためのパスを返す
        return Storage::disk('s3')->url($fileName);
    }

やってること
  • uploadBase64ToS3()メソッドで引数にbase64文字列を受け取る
  • 拡張子を取得 & ファイルに不要なテキスト (data:{拡張子};base64,まで)を削除した文字列をデコードする
  • ファイル名をつけて、S3にアップロード & データベースに保存するパスを返す