バケット内のアイテム一覧を取得する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}});