Closed2

【コピペ用】base64 で受け取った画像を Storage ファサードで保存

ふわせぐふわせぐ
function storeBase64Image(string $context): string
{
    // base64 の形式に則って文字列を分割
    [, $split] = explode(';', $context, 2) + [1 => ''];
    [, $split] = explode(',', $split, 2) + [1 => ''];

    // デコード
    $fileData = base64_decode($split, true);

    // base64 形式でなければエラー
    if ($fileData === false) {
         throw new \RuntimeException("dataURIの形式が正しくありません");
    }

    // ファイルタイプを取得
    $finfo = finfo_open(FILEINFO_MIME_TYPE);

    // finfo_open が resource|false を返すが,finfo_buffer が resource を期待するため明示的にチェック
    assert(is_resource($finfo));
    $fileType = finfo_buffer($finfo, $fileData);

    // 拡張子を決める
    $extension = match ($fileType) {
        'image/png' => 'png',
        'image/jpeg' => 'jpg',

        // png か jpeg でなければエラー
        default => throw new \RuntimeException("画像ファイルは png か jpg にしてください"),
    };

    // 画像を一意に決めるために uuid を使う
    $uuid = Str::uuid();

    // S3 に画像をアップロード
    Storage::put(
        path: $path = "images/{$uuid}.{$extension}",
        contents: $fileData,
        options: 'private',
    );

    return $path;
}
このスクラップは2023/01/20にクローズされました