7

S3 で fs.exists() と同等の処理を行う方法を見つけようとしています。

バケットの内容を取得することに成功しましたが、特定のファイルがバケットに存在するかどうかを S3 に問い合わせる方法がわかりません (ファイルのリスト全体をダウンロードしてクライアント側で確認したくありません。多くのファイル)。

参考: S3.GET に関する AWS2JS ドキュメント

var s3 = require('aws2js').load('s3', appConfig.awsAccessKeyId, appConfig.awsSecretAccessKey);  
s3.setBucket(appConfig.awsBucketName);

            var folder = encodeURI('reports');
            var url = '?prefix=' + folder;

            s3.get(url,{Contents: null, Key: 'reports/emot_cat_r1180341142.png'},'xml', function (error, data) {
                console.log("Error",error);
                console.log("Data",data);
                true.should.be.true;
                done();
            });

出力

{ 名前: 'umusergen'、プレフィックス: 'reports'、マーカー: {}、MaxKeys: '1000'、IsTruncated: 'false'、コンテンツ: [ { キー: 'reports/'、LastModified: '2013-06-16T17: 44:25.000Z'、ETag: '"d41d8cd98f00b204e9800998ecf8427e"'、サイズ: '0'、所有者: [オブジェクト]、StorageClass: 'STANDARD' }、{ キー: 'reports/emot_cat_r1180341142.png'、LastModified: '2013-06 -16T23:18:59.000Z'、ETag: '"0b04aa9146d36a447019b1aa94be7eb3"'、サイズ: '26374'、所有者: [オブジェクト]、StorageClass: 'STANDARD' }、{ キー: 'reports/polarity_r1180341142.png'、LastModified: ' 2013-06-16T23:19:00.000Z'、ETag:'"22fd521e0a5e858040082d0d47078532"'、サイズ: '23091'、所有者: [オブジェクト]、StorageClass: 'STANDARD' }、{ キー: 'reports/wordcloud_r1180341142.png'、LastModified: '2013-06-16T23:19:07.000Z'、ETag : '"9f7ee9d2fdce5f460b2c42444edd6efc"'、サイズ: '167164'、所有者: [オブジェクト]、StorageClass: 'STANDARD' } ]、'@': { xmlns: { xmlns: 'StorageClass: 'STANDARD' } ], '@': { xmlns: { xmlns: 'StorageClass: 'STANDARD' } ], '@': { xmlns: { xmlns: 'http://s3.amazonaws.com/doc/2006-03-01/ ' } } }

「{Contents: null, Key: '[file path/name]'}」は、上記の API 命令を解釈する試みです。

ご覧のとおり、バケットの内容を列挙しているだけですが、特定のファイルの存在を確認するには API 呼び出しが必要です。

誰でも助けることができますか?私はこれらすべてにかなり慣れていません。

4

2 に答える 2

11

HEAD リクエストを使用して HTTP で行う必要があります。存在しないファイルは、404 エラーをトリガーします。簡単な実装を次に示します。

var s3 = require('aws2js').load('s3', process.env.AWS_ACCEESS_KEY_ID, process.env.AWS_SECRET_ACCESS_KEY)

s3.setBucket(process.env.AWS2JS_S3_BUCKET)

s3.head(process.argv[2], function (err, res) {
    if (err) {
        console.log(err)
        return
    }
    console.log(res)
})

テスト目的で、次のように呼び出します。

node s3-check.js file/path.foo

例:

node s3-check.js foo1.png
{ 'x-amz-id-2': 'BU8rLC35oZdNLh4TkE9Y5+czR5r9hg7kl/EbhkxUF+cA94F41knI2YNs/YG1acQg',
  'x-amz-request-id': '7714B364EC1A27B2',
  date: 'Mon, 17 Jun 2013 06:42:52 GMT',
  'last-modified': 'Tue, 28 May 2013 13:18:12 GMT',
  etag: '"2830931876c37237ae98458a99e86d85"',
  'accept-ranges': 'bytes',
  'content-type': 'image/png',
  'content-length': '1165',
  server: 'AmazonS3' }

node s3-check.js foo0.png
{ [Error: API error with HTTP Code: 404]
  headers:
   { 'x-amz-request-id': '96841B9C0BC5E66D',
     'x-amz-id-2': 'ZMZH9bkrR6nhDkWK1hM+qm0dlzBOYhOZhVyT3nKlMuZgPag//5EhfBuAHZq+9ZRm',
     'content-type': 'application/xml',
     'transfer-encoding': 'chunked',
     date: 'Mon, 17 Jun 2013 06:43:53 GMT',
     server: 'AmazonS3' },
  code: 404 }
于 2013-06-17T06:46:41.127 に答える