AWS SDKでS3へ画像アップロードってどうやるんや?
やり方は何となく分かりますが、いまいち分かりにくいサイトが多い。。
てことで今回は、AWS SDKでS3へ画像アップロードを行う方法を解説します!
環境
言語:PHP
サービス:AWS S3
前提
・ライブラリ「aws-sdk」がインストールされていること
S3へ画像アップロードをする前に
S3へ画像をアップロードをする前に考えなくてはならないことがあります。
ファイルはクライアントで選択したものをサーバ(Laravel)で処理することになりますが、どういった形式でファイル情報を送信するかを決めなければなりません。
方法としては以下の2つです。
・multipart/form-dataで送信
・json形式で送信
今回は、json形式で送信することにします。
画像をJSON形式で送信するために
画像をjson形式で送信するには、ファイル情報をBase64でエンコードする必要があります。
つまり、サーバ側ではBase64でエンコードされたファイル情報を受け取ることを前提とします。
※注意点として、Base64でエンコードすると、ファイルの先頭に「data:image/png;base64,」という文字列が付きます。これは画像アップロード時に不要なので削除する必要があります。
今回は、クライアントで上記文字列を削除している前提で考えます。
画像アップロード方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php namespace App\Services\Aws; use Aws\S3\S3Client; /** * S3サービス */ class S3Service { private $s3; public function __construct() { $this->s3= new S3Client([ 'version' => '*** version ***', 'region' => '*** region ***', 'credentials' => [ 'key' => '*** key ***', 'secret' => '*** secret ***', ], ]); } /** * オブジェクトを登録する * * @link https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject * * @param string key キー(例:ファイル名) * @param string body オブジェクト(例:ファイル) */ public function putObject($key, $body) { $this->s3->putObject([ 'Bucket' => '*** Bucket ***', 'Key' => $key, 'Body' => base64_decode($body), // Base64でエンコードされたファイルをデコード ]); } } |
上記がPHP(Laravel)での画像アップロードのソースコードになります。コード自体はシンプルです。
putObjectの概要
putObjectを使用して画像アップロードを行いますが、以下がざっくり概要になります。
Bucket | S3のバケット名 ※Bucket名が「sample」の場合、「sample」と指定します。 |
---|---|
Key | ファイルアップロード先フォルダ&ファイル名 ※ファイルアップロード先が「sample/img/」でファイル名が「sample.png」の場合、「img/sample.png」と指定します。 |
Body | ファイル ※今回はBase64でエンコードされたファイル情報をデコードしています。 |
まとめ
画像のアップロード自体は簡単ですが、どちらかというとファイルのBase64エンコードとかの方がややこしいですね。
ファイルアップロードはシステム要件として求められることが多いですが、分かりにくさもあります。
今回の記事があなたのためになれば幸いです。