保存したい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にアップロード & データベースに保存するパスを返す
LaravelでS3バケットを使用して画像を保存する際に
base64エンコードされた文字列画像をアップしたかった