こんにちは、おにぎりエンジニアの平尾です。今日はおにぎりを3つ食べました。 今回は、AWS SDK for PHP 2 を使用してAmazon S3にファイルをアップしてみます。
Amazon S3とは
特徴
- 容量無制限
- インフラに気を使わなくていい
- 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 | AWS
(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を使用し、ファイルの内容のハッシュ値をファイル名としました。
では試してみましょう!
送信ボタンをクリックし、コンソールからバケット内を確認してみます。
かなり簡単にできる感じですね。
画像を公開したい場合は,S3Client.upload 第4引数を 'public-read' に設定しないといけません。 後気になった点が、ファイルアップ時のリクエストのヘッダの中に、ファイルのMD5値を入れて送ると、PUT完了時にS3側でアップロードされたファイルのMD5値を取って検証をしてくれる機能があるみたいです。次回Ver3で試してみます。
実は書いている時にversion3 がリリースされていて、試してみたら動かなかった!次回試してみます
今回のおすすめおにぎりはこちら!!
五穀入りおにぎり 梅チーズ
http://natural.lawson.co.jp/recommend/commodity/00001/008168.html