【AWS】S3へファイルアップロード(PHP)
以前書いた FuelPHPでファイルアップロード の続きで、Amazon S3へアップロードする部分をまとめます。
事前準備
SDKセットアップ
composerを使ってインストールします。
以下をcomposer.jsonに追加してcomposer installを実行します。
"aws/aws-sdk-php": "^3.99"
実装
S3へアップロードする処理
ライブラリ
use \Aws\Credentials\CredentialProvider;
use \Aws\S3\S3Client;
use \Aws\S3\Exception\S3Exception;
アップロード処理
// ①認証情報を取得
$provider = CredentialProvider::defaultProvider();
// ②S3Clientを生成
$s3client = new S3Client([
'region' => 'ap-northeast-1',
'version' => '2006-03-01',
'credentials' => $provider,
]);
foreach (Upload::get_files() as $file) {
// ③URLを決定
$filename = 'images/'.$file['saved_as'];
// ④イメージファイルをバイナリモードで開く
$image = fopen($file['saved_to'].$file['saved_as'], 'rb');
// ⑤イメージファイルのContentTypeを取得
$content_type = mime_content_type($file['saved_to'].$file['saved_as']);
try{
// ⑥S3へアップロード
$result = $s3client->putObject(array(
'Bucket' => 'test-bucket',
'ACL' => 'private',
'Key' => $filename,
'Body' => $image,
'ContentType' => $content_type,
));
} catch(S3Exception $e){
// エラー処理
if($e->getAwsErrorCode() == 'NoSuchBucket'){
// バケットが見つからない
} else if($e->getAwsErrorCode() == 'InvalidArgument'){
// パラメータ不正
}
}
}
①CredentialProvider::defaultProvider()によりAWS認証情報を取得
環境変数、.iniファイル、credentialsの順によしなに取得してくれます。
ローカルで実行する場合はputenvか、Dockerの場合以下をPHPコンテナの設定に追記すればOKです。
environment:
AWS_ACCESS_KEY_ID: XXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
②S3Clientを生成
S3に対する操作を行うためのクラス、①で取得した認証情報を指定します。
③URLを決定
バケット以下のURLは自由に決定することができます。
これがアップロードするときのKeyになり、同一のKeyが存在した場合は上書きされます。
④ファイルをバイナリモードで開く
イメージファイルのアップロードなのでバイナリモードのリソースが必要になる。
fopenで'rb'を指定すればOK
⑤ファイルのContentTypeを取得
イメージでも複数許可しているので、正しいContentTypeを取得します。
⑥S3へアップロード
バケット名、ACL、③〜⑤で取得した値を設定してアップロードします。
ACLはバケットの属性、(privateやpublicなど)、これが間違っているとアップロードできません。
成功すると$resultにはAws\Resultオブジェクトが入ります。
https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.Result.html
エラー処理
エラー発生時はS3Exceptionが発生するので、$e->getAwsErrorCode()により原因が特定できます。
詳細は以下をご確認ください。
https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.Exception.S3Exception.html
コメント
コメントを投稿