AWS SDK for PHP 2でAmazon S3のファイルをDownload・Uploadする方法メモ


AWS SDK

※当ブログではアフィリエイト広告を利用しています。

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」を指定したい場合、Keytestfolder/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;

?>

実行すると下記のような感じで指定したファイルがダウンロードできます。
S3からのダウンロード

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でアップロードしたファイルが確認できます。
S3 Upload

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のファイルを操作できました。いろいろな応用が利きそうなので、他のメソッドについても調べてみたいと思います。