PHPプログラマ必見!AmazonS3をPHPから操作する方法

公式サイト・ドキュメント

※1:例えばPerlだと非公式のCPANモジュールを使うしかないのですが、Amazon::S3はもう3年間もメンテされていなくて若干悲しい思いをしました。

AWS SDK for PHPをインストールする

開発が活発に行われているので、最新版に追従できる体制にしておきましょう。
ここではpearインストールをお勧めします。
Pearインストール
sudo pear channel-discover pear.amazonwebservices.com 
sudo pear install aws/sdk
PHPのバージョンが古い(5.1以下)とインストールでこけますが、-fオプションを付ければ強制インストールできます。
sudo pear install -f aws/sdk
アップグレード
ライブラリの新バージョンがリリースされたら下記のようにしてアップグレードします。
sudo pear channel-update pecl.php.net
sudo pear upgrade aws/sdk

AWS SDK for PHPを使うサンプルコード

下記のようにしてテキストファイルを準備してください。
echo "hello" > /tmp/hello.txt
また、AWS Management Consoleにログインしてバケットを作成しておきましょう。
(例:バケット名 "my-sample")

以下、アップロード、ダウンロード、オブジェクトの一覧を表示するサンプルコードです。
<?php

/**
 * ライブラリを読み込んで初期化します。
 */
require_once 'AWSSDKforPHP/sdk.class.php';
$s3 = new AmazonS3(array(
                       'key' => 'AWSアクセスキーIDを書く',
                       'secret' => 'AWSシークレットキーを書く',
));

$bucket = "my-samle";

// オブジェクト(ファイル)をアップロードします。
$response = $s3->create_object($bucket, "foo/test.txt", array(
                                   "fileUpload" => "/tmp/hello.txt",
                                   "acl" => AmazonS3::ACL_PRIVATE,
                                   "contentType" => "text/plain"
                                   ));

if ($response->isOK()) {
    echo "OK\n";
} else {
    echo "NG\n";
}

// 同じファイルを別名でアップロードします。
$response = $s3->create_object($bucket, "foo/日本語.txt", array(
                                   "fileUpload" => "/tmp/hello.txt",
                                   "acl" => AmazonS3::ACL_PRIVATE,
                                   "contentType" => "text/plain"
                                   ));


if ($response->isOK()) {
    echo "OK\n";
} else {
    echo "NG\n";
}

//S3上のオブジェクトをローカルにダウンロード
$response = $s3->get_object($bucket, 'foo/test.txt', array(
                                 'fileDownload' => '/tmp/downloaded.txt'
));
if ($response->isOK()) {
    echo "OK\n";
} else {
    echo "NG\n";
}


//S3上のオブジェクトを取得して変数に保持
$response = $s3->get_object($bucket, 'foo/日本語.txt', array(
                                ));
if ($response->isOK()) {
    echo "OK\n";
} else {
    echo "NG\n";
}

//オブジェクトの中身を表示
echo "====body====\n" . $response->body. "============\n";

//アップ済みオブジェクトのリストを取得
$response = $s3->list_objects($bucket,array(
                                  'prefix' => 'foo/',
                                  ));

$objects = $response->body->Contents;

// $objectsはCFSimpleXMLクラスのインスタンス。
// Compositeパターンになっている。

assert($objects instanceof  CFSimpleXML);

foreach ($objects as $obj) {
    assert($obj instanceof  CFSimpleXML);
    var_dump($obj);
}
実行結果
OK
OK
OK
OK
====body====
hello
============
object(CFSimpleXML)#9 (6) {
  ["Key"]=>
  string(12) "foo/test.txt"
  ["LastModified"]=>
  string(24) "2012-09-05T18:02:11.000Z"
  ["ETag"]=>
  string(34) ""b1946ac92492d23xxxxxxx2611184""
  ["Size"]=>
  string(1) "6"
  ["Owner"]=>
  object(CFSimpleXML)#10 (2) {
    ["ID"]=>
    string(64) "hogefuga76f79601cdcb9aa98f3925507cf2ac4f9930c4"
    ["DisplayName"]=>
    string(8) "dqneo"
  }
  ["StorageClass"]=>
  string(8) "STANDARD"
}
object(CFSimpleXML)#11 (6) {
  ["Key"]=>
  string(17) "foo/日本語.txt"
  ["LastModified"]=>
  string(24) "2012-09-05T18:02:11.000Z"
  ["ETag"]=>
  string(34) ""b1946ac92492d234xxxxxxxx611184""
  ["Size"]=>
  string(1) "6"
  ["Owner"]=>
  object(CFSimpleXML)#9 (2) {
    ["ID"]=>
    string(64) "hogefuga76f79601cdcb9aa98f3925507cf2ac4f9930c4565b4b6d2"
    ["DisplayName"]=>
    string(8) "dqneo"
  }
  ["StorageClass"]=>
  string(8) "STANDARD"
}
をを、かんたん!!

こんな感じで非常に手軽にファイルをアップロード&ダウンロードすることができます。
ぜひ一度使ってみてください。
参考
AWS SDK for PHPでS3にファイルアップロード
カテゴリ: