AWS S3 object listing

前端 未结 6 2161
南方客
南方客 2021-02-06 20:52

I am using aws-sdk using node.js. I want to list images in specified folder e.g.\"This

相关标签:
6条回答
  • 2021-02-06 21:03

    Folders are illusory, but S3 does provide a mechanism to emulate their existence.

    If you set Delimiter to / then each tier of responses will also return a CommonPrefixes array of the next tier of "folders," which you'll append to the prefix from this request, to retrieve the next tier.

    If your Prefix is a "folder," append a trailing slash. Otherwise, you'll make an unnecessary request, because the first request will return one common prefix. E.g., folder "foo" will return one common prefix "foo/".

    0 讨论(0)
  • 2021-02-06 21:06

    You can use the Prefix in s3 API params. I am adding an example that i used in a project:

    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));
            }
        });
    })
    

    Here Bucket is the name of the bucket that contains a folder and Folder is the name of the folder that you want to list files in.

    0 讨论(0)
  • 2021-02-06 21:08

    Alternatively you can use minio-js client library, its open source & compatible with AWS S3 api.

    You can simply use list-objects.js example, additional documentation are available at 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'
    })
    // List all object paths in bucket 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)
    })
    

    Hope it helps.

    Disclaimer: I work for Minio

    0 讨论(0)
  • 2021-02-06 21:14

    It's working fine now using this code :

    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);
    });
    
    0 讨论(0)
  • 2021-02-06 21:20

    I put up a little module which lists contents of a "folder" you give it:

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

    will print something like this:

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

    And that

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

    will print

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

    UPD: The latest version supports async/await Promise interface:

    const { files, folders } = await lister.ls("/my-folder/subfolder/");
    

    And here is the 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)
        }
      };
    };
    
    0 讨论(0)
  • 2021-02-06 21:23

    As mentioned in the comments, S3 doesn't "know" about folders, only keys. You can imitate a folder structure with / in the keys. See here for more information - http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html

    That said, you can modify your code to something like this:

    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);
    });
    

    This will check each key to see if it contains a /

    0 讨论(0)
提交回复
热议问题