PHP+Amazon S3でファイルアップローダーを作る
ありがちですが、ユーザーがフォームからファイル名を指定して、送信ボタンを押すとそれがAmazon S3に保存される・・・というシステムを作ります。
フォームは次のように、ただファイル名を入力する欄だけ用意しておきます。
<form action=”./upload_test.php” method=”post” enctype=”multipart/form-data”>
<input type=”file” name=”data”>
<input type=”submit”>
</form>
ローカルPCからデータをAmazon S3にアップロード
WEBサーバ上にあるファイルをAmazon S3に転送する方法は、PHPからAmazon S3を使うに書きました。
これをそのまま使って、WEBサーバからではなく、ユーザーのローカルPCのファイルをS3にアップロードするようにします。
$s3 = new AmazonS3();
$s3->create_object(“katty-practice2”, “upload_test.jpg”, array(‘fileUpload’=>$_FILES[‘data’][‘tmp_name’], ‘acl’=>AmazonS3::ACL_PRIVATE));
先の方法と本質的に変わったのは、fileUploadの要素だけです。ここにユーザーから送信されたファイルの場所を指定するだけです。
この$_FILES[‘data’][‘tmp_name’]の中身を見てみると、次のようにローカルPCのアドレスになっているのですが、うまいことやってアップロードしてくれます。
C:UserskattyDocumentstest.jpg
簡単なアクセス制限
今回は、acl(Access Control Listのこと)の要素に、AmazonS3::ACL_PRIVATEを指定しました。
これによって、アップロードしたファイルは、単純にURLを叩いても外から見えなくなります。
では、どのURLでアクセスしたら良いか?というのをライブラリを使って問い合わせてみます。
echo $s3->get_object_url(“katty-practice2”, “upload_test.jpg”, ‘1 minutes’);
この意味は?
katty-practice2というバケットのupload_test.jpgという画像のURLをください。ただし、そのURLは1分間で無効にしてください。
これによって、次のような長ったらしくて、暗号的なURLが手に入ります。これを使えば、1分間は、そのデータにアクセスできるようになります。
http://katty-practice2.s3.amazonaws.com/upload_test.jpg?AWSAccessKeyId=AKIAJE2IJHFYBVWUYV2Q&Expires=1301595777&Signature=v%2FLLfkNWjJsU7rPJrvbgo%2BTAA6A%3D
あとは、データベースなどでファイルのアクセス権限を管理して、許可されたユーザーにはその都度URLを問い合わせて渡せば簡単なアクセス制限ができると思われます。
コメント