2015-06-09 110 views
19

我正在使用使用node.js的aws-sdk。我想列出指定文件夹中的图像,例如This is the directory that i want to fetchAWS S3对象列表

我想列出所有文件和文件夹在这个位置但不是文件夹(图像)的内容。 aws-sdk中有list Object function,但它也列出了所有的嵌套文件。

下面是代码:

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

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是要在列出文件的文件夹的名称桶的名称。 S3没有文件夹/文件等的概念......它只是有键 - 你可以使用/在键中模仿文件夹结构。 – Alex

+0

请显示您目前的代码 – Alex

+0

var AWS = require('aws-sdk'); AWS.config.update({accessKeyId:'mykey',secretAccessKey:'mysecret',region:'myregion'}); var s3 = new AWS.S3(); VAR PARAMS = { 铲斗: 'mystore.in', 定界符: '', 前缀: 'S/5469b2f5b4292d22522e84e0/ms.files' }; (err,data){if(err)throw err; console.log(data); }); – Rohit

回答

18

文件夹是虚幻,但是S3 确实提供了一种模拟它们存在的机制

如果设置Delimiter/则回应每一层也将返回一个CommonPrefixes阵列“文件夹,”你会追加到前缀从这个请求,检索下一层的下一层。

如果您的Prefix是“文件夹”,则附加一个尾部斜线。否则,您将发出不必要的请求,因为第一个请求将返回一个公共前缀。例如,文件夹“foo”将返回一个通用前缀“foo /”。

+0

谢谢迈克尔,现在它的正常工作。 – Rohit

1

正如评论所说,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); 
}); 

这将检查每一个关键看它是否包含一个/

19

它的正常工作,现在使用此代码:

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

仅供参考 - 在'listObjects'之后,我在做'getObject',并且我发现''params''对象需要包含'Bucket'&'Key',你不能让'Prefix'或'getObject'出错。 '分隔符'也可能会导致问题,但我不记得确定。干杯 – Jacksonkr

0

或者您可以使用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' 
}) 
// 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) 
}) 

希望它有帮助。

声明:我Minio

8

我放了一个小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) 
    } 
    }; 
}; 
1

可以在S3 API PARAMS使用Prefix。我加入,我在项目中使用的例子: