web-dev-qa-db-ja.com

AWS S3オブジェクトリスト

Node.jsを使用してaws-sdkを使用しています。指定したフォルダー内の画像を一覧表示したい.This is the directory that i want to fetch

この場所にあるすべてのファイルとフォルダーをリストしますが、フォルダー(イメージ)コンテンツはリストしません。 aws-sdkには オブジェクト関数のリスト がありますが、ネストされたファイルもすべてリストしています。

コードは次のとおりです。

var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: 'mykey', secretAccessKey: 'mysecret', region: 'myregion'});
var s3 = new AWS.S3();

var params = { 
  Bucket: 'mystore.in',
  Delimiter: '',
  Prefix: 's/5469b2f5b4292d22522e84e0/ms.files' 
}

s3.listObjects(params, function (err, data) {
  if(err)throw err;
  console.log(data);
});
40
Rohit

フォルダーは幻想ですが、S3 doesはフォルダーの存在をエミュレートするメカニズムを提供します。

Delimiter/に設定すると、応答の各層は、「フォルダー」の次の層のCommonPrefixes配列も返します。この配列は、これからプレフィックスに追加します次の層を取得するためのリクエスト。

Prefixが「フォルダー」の場合、末尾にスラッシュを追加します。それ以外の場合、最初のリクエストは1つの共通プレフィックスを返すため、不要なリクエストを作成します。たとえば、フォルダ "foo"は、1つの一般的なプレフィックス "foo /"を返します。

25

このコードを使用して、現在正常に動作しています:

var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: 'mykey', secretAccessKey: 'mysecret', region: 'myregion'});
var s3 = new AWS.S3();

var params = { 
 Bucket: 'mystore.in',
 Delimiter: '/',
 Prefix: 's/5469b2f5b4292d22522e84e0/ms.files/'
}

s3.listObjects(params, function (err, data) {
 if(err)throw err;
 console.log(data);
});
34
Rohit

私は少し module を付けました。これはあなたが与えた "フォルダ"の内容をリストしています:

s3ls({bucket: 'my-bucket-name'}).ls('/', console.log);

このようなものを印刷します:

{ files: [ 'funny-cat-gifs-001.gif' ],
  folders: [ 'folder/', 'folder2/' ] }

そしてそれ

s3ls({bucket: 'my-bucket-name'}).ls('/folder', console.log);

印刷します

{ files: [ 'folder/cv.docx' ],
  folders: [ 'folder/sub-folder/' ] }

そして、これはs3ls.js

var _ = require('lodash');
var S3 = require('aws-sdk').S3;

module.exports = function (options) {
  var bucket = options.bucket;
  var s3 = new S3({apiVersion: '2006-03-01'});

  return {
    ls: function ls(path, callback) {
      var prefix = _.trimStart(_.trimEnd(path, '/') + '/', '/');    
      var result = { files: [], folders: [] };

      function s3ListCallback(error, data) {
        if (error) return callback(error);

        result.files = result.files.concat(_.map(data.Contents, 'Key'));
        result.folders = result.folders.concat(_.map(data.CommonPrefixes, 'Prefix'));

        if (data.IsTruncated) {
          s3.listObjectsV2({
            Bucket: bucket,
            MaxKeys: 2147483647, // Maximum allowed by S3 API
            Delimiter: '/',
            Prefix: prefix,
            ContinuationToken: data.NextContinuationToken
          }, s3ListCallback)
        } else {
          callback(null, result);
        }
      }

      s3.listObjectsV2({
        Bucket: bucket,
        MaxKeys: 2147483647, // Maximum allowed by S3 API
        Delimiter: '/',
        Prefix: prefix,
        StartAfter: prefix // removes the folder name from the file listing
      }, s3ListCallback)
    }
  };
};
12
Vasyl Boroviak

S3 APIパラメーターでPrefixを使用できます。私はプロジェクトで使用した例を追加しています:

listBucketContent: ({ Bucket, Folder }) => new Promise((resolve, reject) => {
    const params = { Bucket, Prefix: `${Folder}/` };
    s3.listObjects(params, (err, objects) => {
        if (err) {
            reject(ERROR({ message: 'Error finding the bucket content', error: err }));
        } else {
            resolve(SUCCESS_DATA(objects));
        }
    });
})

ここで、Bucketはフォルダーを含むバケットの名前であり、Folderはファイルをリストするフォルダーの名前です。

3
Gaurav Sharma

コメントで述べたように、S3はフォルダーについて「認識」せず、キーのみを認識します。キーに/を使用して、フォルダー構造を模倣できます。詳細については、こちらを参照してください- http://docs.aws.Amazon.com/AmazonS3/latest/UG/FolderOperations.html

ただし、コードを次のように変更できます。

s3.listObjects(params, function (err, data) {
  if(err) throw 

  //data.contents is an array of objects according to the s3 docs
  //iterate over it and see if the key contains a / - if not, it's a file (not a folder)
  var itemsThatAreNotFolders = data.contents.map(function(content){
    if(content.key.indexOf('/')<0) //if / is not in the key
        return content;
  });

  console.log(itemsThatAreNotFolders);
});

これにより、各キーが/を含むかどうかが確認されます

1
Alex

または、 minio-js クライアントライブラリ、そのオープンソース、AWS S3 APIとの互換性を使用できます。

単にlist-objects.jsの例を使用できます。追加のドキュメントは https://docs.minio.io/docs/javascript-client-api-reference で入手できます。

 var Minio = require( 'minio')
 
 var s3Client = new Minio({
 endPoint: 's3.amazonaws.com'、
 accessKey: 'YOUR-ACCESSKEYID'、
 secretKey: 'YOUR-SECRETACCESSKEY' 
})
 //バケットmy-bucketnameのすべてのオブジェクトパスをリストします。
 var objectsStream = s3Client.listObjects( 'my-bucketname'、 ''、true)
 objectsStream.on( 'data'、function(obj){
 console.log(obj)
})
 objectsStream.on( 'error'、function(e){
 console.log(e)
})

それが役に立てば幸い。

免責事項: Minio で働いています

1
koolhead17