2011年12月19日月曜日

S3にブラウザから直接アップロードするフォーム(HTML)をPHPで生成

スズキです。

S3にブラウザから直接アップロードする方法を下記で紹介しましたが、
JAWS-UG宮崎第3回勉強会LT資料(Browser Uploads to S3 using HTML POST Forms)
そのときは、静的なHTMLフォームを前提として、Base64のpolicyやsignatureは
別プログラム(Ruby)で作成していました。

今回は、そのHTMLフォームをPHPで生成し、有効期限やアップロードファイル名、
リダイレクト先などを動的に変更できるようにしてみました。

コードは下記のとおりです。

<?php
$id         = "00000000";
$expiration = gmdate("Y-m-d\TH:i:s\Z",strtotime("1 minute"));
$redirect   = "http://www.suz-lab.com/index.html?id=$id";
$policy = <<<EOS
{
    "expiration": "$expiration",
    "conditions": [
        {"bucket": "www.suz-lab.com"},
        ["starts-with", "\$key", ""],
        {"acl": "private"},
        {"success_action_redirect": "$redirect"},
        ["starts-with", "\$Content-Type", ""],
        ["content-length-range", 0, 1048576]
    ]
}
EOS;
$signature = hash_hmac("sha1", base64_encode($policy), "SECRET_KEY", true);
?>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  </head>
  <body>
    <form action="http://www.suz-lab.com.s3.amazonaws.com/"
          method="post" enctype="multipart/form-data">
      <input type="hidden" name="key"
             value="<?php print("${id}.txt"); ?>"/>
      <input type="hidden" name="AWSAccessKeyId"
             value="ACCESS_KEY"/>
      <input type="hidden" name="acl"
             value="private"/>
      <input type="hidden" name="success_action_redirect"
             value="<?php print($redirect); ?>"/>
      <input type="hidden" name="policy"
             value="<?php print(base64_encode($policy)); ?>"/>
      <input type="hidden" name="signature"
             value="<?php print(base64_encode($signature)); ?>"/>
      <input type="hidden" name="Content-Type"
             value="text/plain"/>
      <input type="file"   name="file"/>
      <input type="submit" name="button" value="Upload"/>
    </form>
  </body>
</html>

上記は有効期限をHTMLフォームが作成されてから1分以内とし、アップロードファイル名や
リダイレクトURLにid(ユーザーIDなど)が反映されるようにしています。

S3へのアップロードが成功すると、下記にリダイレクトされ、リダイレクトURLに
事前につけておいたパラメータ(id=00000000)も引き継がれていることがわかります。

http://www.suz-lab.com/index.html?id=00000000&bucket=www.suz-lab.com&key=00000000.txt&etag=%22...%22

さらに、HTMLフォームが生成された後、1分後にアップロードすると、
次のように、ちゃんとエラーになりました。


これで、いつでも使えます!
--------
http://www.suz-lab.com/

0 コメント: