AWS S3对象列表

我正在使用node.js使用aws-sdk。 我想列出指定文件夹中的图像,例如 这是我想要获取的目录

我想列出这个位置的所有文件和文件夹,但不是文件夹(图像)的内容。 在aws-sdk中有列表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); }); 

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

如果将Delimiter设置为/则每层响应也将返回下一层“文件夹”的CommonPrefixesarrays,您将从此请求中追加前缀,以检索下一层。

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

现在使用这个代码工作正常:

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

我把一个小模块列出了你给它的“文件夹”的内容:

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

正如在评论中提到的,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); }); 

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

或者,您可以使用minio-js客户端库,它的开放源代码并与AWS S3 api兼容。

您可以简单地使用list-objects.js示例,其他文档可以在https://docs.minio.io/docs/javascript-client-api- list-objects.js中find。

 var Minio = require('minio')

 var s3Client = new Minio({
   endPoint:'s3.amazonaws.com',
   accessKey:'YOUR-ACCESSKEYID',
   secretKey:'YOUR-SECRETACCESSKEY'
 })
 //列出bucket my-bucketname中的所有对象path。
 var objectsStream = s3Client.listObjects('my-bucketname','',true)
 objectsStream.on('data',function(obj){
  执行console.log(OBJ)
 })
 objectsStream.on('error',function(e){
  的console.log(e)中
 })

希望能帮助到你。

免责声明:我为Minio工作