AWS S3 对象列表
AWS S3 object listing
我正在使用 node.js 使用 aws-sdk。我想列出指定文件夹中的图像,例如
我想列出此位置中的所有文件和文件夹,但不列出文件夹(图像)内容。 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);
});
如评论中所述,S3 不 "know" 关于文件夹,只有键。您可以在键中使用 / 模仿文件夹结构。有关详细信息,请参阅此处 - 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);
});
这将检查每个键以查看它是否包含 /
文件夹是虚幻的,但 S3 确实提供了一种机制来模拟它们的存在。
如果您将 Delimiter
设置为 /
,那么每一层响应也会 return 一个 "folders," 下一层的 CommonPrefixes
数组'将附加到此请求的前缀,以检索下一层。
如果您的 Prefix
是 "folder,",请附加一个尾部斜线。否则,您将发出不必要的请求,因为第一个请求将 return 一个公共前缀。例如,文件夹 "foo" 将 return 一个公共前缀 "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);
});
或者您可以使用 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
工作
我放了一点 module 列出了你给它的 "folder" 的内容:
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/' ] }
UPD:最新版本支持async/awaitPromise接口:
const { files, folders } = await lister.ls("/my-folder/subfolder/");
这里是 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 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
是您要在其中列出文件的文件夹的名称。
我正在使用 node.js 使用 aws-sdk。我想列出指定文件夹中的图像,例如
我想列出此位置中的所有文件和文件夹,但不列出文件夹(图像)内容。 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);
});
如评论中所述,S3 不 "know" 关于文件夹,只有键。您可以在键中使用 / 模仿文件夹结构。有关详细信息,请参阅此处 - 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);
});
这将检查每个键以查看它是否包含 /
文件夹是虚幻的,但 S3 确实提供了一种机制来模拟它们的存在。
如果您将 Delimiter
设置为 /
,那么每一层响应也会 return 一个 "folders," 下一层的 CommonPrefixes
数组'将附加到此请求的前缀,以检索下一层。
如果您的 Prefix
是 "folder,",请附加一个尾部斜线。否则,您将发出不必要的请求,因为第一个请求将 return 一个公共前缀。例如,文件夹 "foo" 将 return 一个公共前缀 "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);
});
或者您可以使用 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
工作我放了一点 module 列出了你给它的 "folder" 的内容:
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/' ] }
UPD:最新版本支持async/awaitPromise接口:
const { files, folders } = await lister.ls("/my-folder/subfolder/");
这里是 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 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
是您要在其中列出文件的文件夹的名称。