バケット内のアイテム一覧を取得する2

ではもうちょっと複雑なことをしてみよう。S3に以下のような構成でファイルをアップしたとする。

  • dir1
    • file1-1.txt
    • file1-2.txt
  • dir2
    • file2-1.txt
    • file2-2.txt
    • file2-3.txt
  • file1.txt
  • file2.txt

こないだ紹介した方法 だと、これら全部を取得することになるのだが、当然フォルダ毎に分けたいので、今回はちょっと手を加えて、指定したフォルダ以下のファイル一覧を取得できるようにした。

<!DOCTYPE html>
<html>
<head>
<title>AWS サンプル</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>
<h1>AWS サンプル</h1>

ディレクトリ:<input type="text" id="text1"> <button id="btn1">listBuckets</button>
<div id="status">結果</div>
<div id="objects">リスト</div>

<script src="http://sdk.amazonaws.com/js/aws-sdk-2.0.0-rc13.min.js"></script>
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
<script src="js/init.js"></script>
<script type="text/javascript">//<![CDATA[
$(function()
{
  $("#btn1").click( function()
  {
    $("#objects").html("");
    var prefix = $("#text1").val();
    if( prefix && prefix[prefix.length-1] != "/" )
      prefix += "/";
    var params = {
      Bucket: BUCKET_NAME,
      Delimiter: "/",
      Prefix: prefix
    };
    s3.listObjects(params, function (err, data) {
      if (err) {
        document.getElementById('status').innerHTML =
          'Could not load objects from S3';
      } else {
        console.dir(data);
        var count = 0;
        // フォルダを表示
        for (var i = 0; i < data.CommonPrefixes.length; i++) {
          document.getElementById('objects').innerHTML +=
            '<li>[' + data.CommonPrefixes[i].Prefix + ']</li>';
          ++count;
        }
        // ファイルを表示(フォルダっぽいものは表示しない)
        for (var i = 0; i < data.Contents.length; i++) {
          var c = data.Contents[i];
          if( c.Key[c.Key.length-1] == "/" )
            continue;
          document.getElementById('objects').innerHTML +=
            '<li>' + data.Contents[i].Key + '</li>';
          ++count;
        }

        document.getElementById('status').innerHTML =
          'Loaded ' + count + ' items from S3';
      }
    });
  });
});
//]]></script>
</body>
</html>

ちなみに、初期化処理は別ファイル(init.js)で行うことにする

var BUCKET_NAME = "バケット名";

AWS.config.update({
  accessKeyId: 'アクセスキー',
  secretAccessKey: 'シークレットキー'
});

AWS.config.region = 'ap-northeast-1';
var s3 = new AWS.S3({params: {Bucket: BUCKET_NAME}});