概要
1個2個のファイルならともかく、20個以上のS3のファイルをサクッとローカルにダウンロードしたいということありませんか?私はありました。そんなときのための覚書。phpのペライチで実現。
前提
プロダクトにs3のキーを持つテーブルがある、ないし別でs3のキー一覧を手元に持っていたとする
事前準備
①VisualStudioCodeをインストール
②拡張機能、PHP Serverをインストール
これにより、ペライチのphpを簡単にブラウザで実行できる。業務効率化にめちゃ便利
③composerをインストール
④composerでaws-sdkをインストール
composer require aws/aws-sdk-php
コード
S3からキーを利用して、ローカルにファイルを落とす場合
<?php
//----------------------------------
// SDK読み込み
//----------------------------------
require_once('/Users/XXXXXX/Desktop/php-workspace/vendor/autoload.php');
use Aws\S3\S3Client;
//----------------------------------
// S3の情報
//----------------------------------
$AWS_ACCESS_KEY_ID = 'XXXXXXXXXXXXXXXX';
$AWS_SECRET_ACCESS_KEY= 'XXXXXXXXXXXXXXXXXXXXXXXXX';
$REGION = 'ap-northeast-1';
$BUCKET = 'xxxxxxxxxxxxxxxxxxxx';
$s3_client = S3Client::factory([
'credentials' => [
'key' => $AWS_ACCESS_KEY_ID,
'secret' => $AWS_SECRET_ACCESS_KEY,
],
'region' => $REGION,
'version' => 'latest',
]);
//----------------------------------
// 1.対象データのs3_keyのリスト
// 手元にある場合はファイルの読み込み、などで取得
// ローカルDBなどにぶち込んで、ここでSQLで引くなども良い
//----------------------------------
$s3_key_list = ['s3のkey_1', 's3のkey_2', 's3のkey_3'];
//----------------------------------
// 2.s3_keyから画像を取得
//----------------------------------
$i = 0;
foreach($s3_key_list as $k => $v){
// 画像取得
$result = '';
$result = $s3_client->getObject([
'Bucket' => $BUCKET,
'Key' => $v // オブジェクトのキー
]);
//----------------------------------
// 3.ファイル名、パスを指定してローカルに保存
//----------------------------------
// ファイル名は好きなものを。s3_key_listと紐づけたいならs3_key_listを連想配列にするもヨシ。
$file_name = 'ファイル名';
// 拡張子決定
$content_type = $result['ContentType'];
$content_type = explode("/",$content_type);
$file_extension = $content_type[1];
// リンク作成&ダウンロード
$cmd = $s3_client->getCommand('GetObject', [
'Bucket' => $BUCKET,
'Key' => $s3_key
]);
$request = $s3_client->createPresignedRequest($cmd, '+1 hour');
// 署名付きURLを取得
$presignedUrl = (string) $request->getUri();
// 画像ダウンロード
$image_data = file_get_contents($presignedUrl);
// ローカルに保存
file_put_contents('/Users/XXXXX/Desktop/php-workspace/images/'.$file_name.'.'.$file_extension, $image_data);
echo "<h1>$i</h1>";
$i = $i + 1;
}
?>