※当ブログではアフィリエイト広告を利用しています。
Amazonが提供するクラウドサービス「Amazon Web Service」ではコンピューティングやストレージなど、様々なサービスが提供されており、SDKを使うことで、多くのプログラミング言語から手軽にサービスを利用できます。
そこでPHP用のSDKを使ってクラウドストレージ「Amazon S3」のファイルをダウンロード・アップロードしてみたので、方法をメモします。
準備
PHPからAmazon S3へアクセスするには「AWS SDK for PHP 2」が必要です。「Download AWS PHP SDK」よりaws.phar
をダウンロードし、インクルードすればすぐに利用可能です。
AWS SDK for PHP 2
http://aws.amazon.com/jp/sdkforphp2/
AWS SDK for PHP 2 公式リファレンス
http://docs.aws.amazon.com/aws-sdk-php-2/latest/index.html
また、Amazon S3にアクセス可能なアクセスキー・シークレットキーが必要です。取得方法は下記ページが参考になります。
アクセスキー ID および秘密アクセスキーを取得する方法
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-credentials.html#using-credentials-access-key
ファイルのダウンロード
ファイルのダウンロードにはAws\S3\S3Client
クラスのgetObject( array $args = array() )
メソッドを使用します。
SDKの読み込みとS3Clientインスタンスの生成
SDKを読み込み、Aws\S3\S3Client
のインスタンスを生成します。パラメータの連想配列のキーkey
にアクセスキーを、secret
にシークレットキーを、region
にリージョンを指定します。サンプルでは東京リージョンを指定しています。
<?php //SDKの読み込み require_once("aws.phar"); use Aws\S3\S3Client; use Aws\Common\Enum\Region; // キー、シークレットキー、リージョンを指定 $client = S3Client::factory(array( 'key' => 'Your Access Key', 'secret' => 'Your Secret Key', 'region' => Region::AP_NORTHEAST_1));
getObjectメソッドでファイルのデータを取得
ファイルのデータを取得するためgetObject( array $args = array() )
メソッドを実行します。パラメータの連想配列のキーBucket
にバケット名を、Key
に対象ファイルを指定します。
// バケット名 $bucket = "Your Bucket Name"; // ダウンロード対象のキー(ファイル識別子) $key = "test.jpg"; $result = $client->getObject(array( 'Bucket' => $bucket, 'Key' => $key ));
フォルダ内のファイルを指定したい場合はスラッシュ区切りでフォルダを指定できます。例えば「testfolder」フォルダの中の「test.jpg」を指定したい場合、Key
はtestfolder/test.jpg
となります。
取得したデータのブラウザ出力
取得したファイルのデータはgetObjectの戻り値の[‘Body’]キーに格納されます。データを読み込んだ後、ダウンロード用のHTMLヘッダーとファイルデータを出力します。
//ファイルサイズ $length = $result['ContentLength']; //ファイルポインタを先頭に戻し、ファイルを読み込む $result['Body']->rewind(); $data = $result['Body']->read($length); //キーからファイル名だけ取り出す $filename = end(explode('/', $key)); /** * ファイルダウンロード用のHTTPヘッダ */ //Content-Type header('Content-Type: application/octet-stream'); //ファイル名 $disposition = 'Content-Disposition: attachment; filename="' . $filename . '"'; header($disposition); //Content-Length $contentlength = 'Content-Length: ' . $length; header($contentlength); echo $data; ?>
実行すると下記のような感じで指定したファイルがダウンロードできます。
getObject( array $args = array() )
メソッドの戻り値からは他にもファイルの最終更新日時やメタデータ等が取得可能です。取得可能な情報は公式リファレンスに記載されています。
getObject
http://docs.aws.amazon.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html#_getObject
ファイルのアップロード
ファイルのアップロードにはAws\S3\S3Client
クラスのputObject( array $args = array() )
メソッドを使用します。
まず以下のような内容で簡単なアップロード用フォームを作成しておきます。
<!DOCTYPE html> <html> <head> <title>アップロード用フォーム</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form method="post" enctype="multipart/form-data" action="s3upload.php"> <input type="file" name="upfile"> <button type="submit">アップロード</button> </form> </body> </html>
SDKの読み込みとS3Clientインスタンスの生成
ダウンロードのときと同様です。
<?php /** * SDKの読み込みとS3Clientインスタンスの生成 */ require_once("aws.phar"); use Aws\S3\S3Client; use Aws\Common\Enum\Region; use Aws\S3\Exception\S3Exception; use Guzzle\Http\EntityBody; // キー、シークレットキー、リージョンを指定 $client = S3Client::factory(array( 'key' => 'Your Access Key', 'secret' => 'Your Secret Key', 'region' => Region::AP_NORTHEAST_1));
アップロードされたファイルの確認とputObjectメソッドでのアップロード
フォームからアップロードされたファイルであるかをis_uploaded_file ( string $filename )
関数で確認します。
ファイルのアップロードのためputObject( array $args = array() )
メソッドを実行します。パラメータの連想配列のキーBucket
にバケット名を、Key
にアップロード先のファイル名を、Body
にアップロードファイルのEntityBodyを指定します。
//フォームからアップロードされたファイル $tmpfile = $_FILES["upfile"]["tmp_name"]; //ファイルがアップロードされていない場合は終了 if (!is_uploaded_file($tmpfile)) { die('ファイルがアップロードされていません'); } // バケット名 $bucket = "Your Bucket Name"; // アップロード先のキー(ファイル識別子) $key = "test2.jpg"; try { $result = $client->putObject(array( 'Bucket' => $bucket, 'Key' => $key, 'Body' => EntityBody::factory(fopen($tmpfile, 'r')), )); } catch (S3Exception $exc) { echo "アップロード失敗"; echo $exc->getMessage(); } ?>
アップロードに成功すると、下記のような感じでS3 Management Consoleでアップロードしたファイルが確認できます。
putObject( array $args = array() )
メソッドでは他にもファイルのアクセス権限ACL
、暗号化ServerSideEncryption
、有効期限Expires
が指定できます。指定・取得可能な情報は公式リファレンスに記載されています。
putObject
http://docs.aws.amazon.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html#_putObject
おわりに
SDKを使用することで、ほとんどコーディングすることなくAmazon S3のファイルを操作できました。いろいろな応用が利きそうなので、他のメソッドについても調べてみたいと思います。