LoginSignup
0
0

サクッとS3からローカルにダウンロードする

Posted at

概要

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;
}
  
?>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0