読者です 読者をやめる 読者になる 読者になる

AWS SDK for PHP 2 を使用してファイルを S3 にアップ!

AWS

こんにちは、おにぎりエンジニアの平尾です。今日はおにぎりを3つ食べました。 今回は、AWS SDK for PHP 2 を使用してAmazon S3にファイルをアップしてみます。

f:id:hiraoy:20150430173353j:plain

Amazon S3とは

aws.amazon.com

特徴

  • 容量無制限
  • インフラに気を使わなくていい
  • 99.999999999%の耐久性
  • 安価!
    • 保存しているデータ量に対して従量課金
    • 課金されるのは送信だけです。受信(Amazon S3へのアップロード)は無料
    • ※微々たる金額ですが、アップロード、ファイルリストの取得などは料金がかかります。

用途

・コンテンツ配信用
・ログの保存
などなど様々な用途で使用できます。

今回つくるもの

ファイルを選択しAmazon S3に保存するWEBページ

事前準備

IAM でユーザを作成
対象ユーザのcredentials を作成して Access Key ID, Secret Access Key を取得

目次

・S3バケットの作成
AWS SDK for PHP2(aws.phar) をダウンロード
・WEBページ作成
・試す

S3バケットの作成

  AWSコンソールから、バケットを作成 -> バケット名を入力しリージョン選択 -> 作成ボタンをクリック(簡単!)
  今回は, hogehoge バケットを作成

AWS SDK for PHP2(aws.phar) をダウンロード

  ダウンロードはこちら → AWS SDK for PHP
  (Amazon S3 のバケットとオブジェクト(保存するファイル)のオペレーションを行うための API を使用できます。)
  

WEBページ作成

環境
CentOS6.5
php 5.5 Apache 2.2.15

ファイル選択html

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form method="post" action="./upload.php" enctype="multipart/form-data">
            <input type="file" name="up_file"><br/>
            <input type="submit" value="送信する">
        </form>
    </body>
</html>

アップロード処理php

<?php
require_once 'aws.phar';//ダウンロードしたもの
use Aws\S3\S3Client;
use Aws\Common\Enum\Region;

uploadFile('up_file');

function uploadFile($name) {
    // アップロード処理
    $file = $_FILES[$name];
    $error = $file['error'];

    // errorがなかった場合
    if ($error == UPLOAD_ERR_OK) {
        $ext = extension($file['name']);
        $srcPath = $file['tmp_name'];
        $destDir = './upload';
        //同じファイル内容のものをアップしないため
        $destFilename = md5_file($srcPath) . '.' . $ext;
        $destPath = $destDir . '/' . $destFilename;

        if (move_uploaded_file($srcPath, $destPath)) {
            chmod($destPath, 0644);

            s3Upload($destPath, '');
        }
    }
}

// 拡張子を取得する
function extension($filename) {
    $str = strrchr($filename, '.');
    if ($str === FALSE) {
        return NULL;
    } else {
        return substr($str, 1);
    }
}

function s3Upload($filePath, $s3Dir) {

    $fileName = basename($filePath);

    $s3 = S3Client::factory(
             array('key'    => '*******',// 取得したAccess Key IDを使用
                   'secret' => '*******',// 取得した Secret Access Keyを使用
                   'region' => Region::AP_NORTHEAST_1));

    $s3->upload(
         "hogehoge/{$s3Dir}",
         $fileName,
         fopen($filePath, 'rb'),
         'public-read'
    );
}

今回は、同一の内容のファイルを復数アップしないように、md5_fileを使用し、ファイルの内容のハッシュ値をファイル名としました。

では試してみましょう!

f:id:hiraoy:20150529135840j:plain

送信ボタンをクリックし、コンソールからバケット内を確認してみます。

f:id:hiraoy:20150529140915j:plain

かなり簡単にできる感じですね。

画像を公開したい場合は,S3Client.upload 第4引数を 'public-read' に設定しないといけません。 後気になった点が、ファイルアップ時のリクエストのヘッダの中に、ファイルのMD5値を入れて送ると、PUT完了時にS3側でアップロードされたファイルのMD5値を取って検証をしてくれる機能があるみたいです。次回Ver3で試してみます。

実は書いている時にversion3 がリリースされていて、試してみたら動かなかった!次回試してみます

今回のおすすめおにぎりはこちら!!

五穀入りおにぎり 梅チーズ
http://natural.lawson.co.jp/recommend/commodity/00001/008168.html