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
设置为/
则每层响应也将返回下一层“文件夹”的CommonPrefixes
arrays,您将从此请求中追加前缀,以检索下一层。
如果您的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工作