Список объектов AWS S3
Я использую aws-sdk, используя node.js. Я хочу перечислить изображения в указанной папке, например ![This is the directory that i want to fetch]()
Я хочу перечислить все файлы и папки в этом месте, но не папку (изображения). В 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);
});
Ответы
Ответ 1
Папки иллюзорны, но S3 обеспечивает механизм для имитации их существования.
Если вы установите Delimiter
в /
, то каждый уровень ответов также вернет массив CommonPrefixes
следующего уровня "папок", который вы добавите к префиксу из этого запроса, чтобы получить следующий уровень.
Если ваш Prefix
является "папкой", добавьте конечную косую черту. В противном случае вы сделаете ненужный запрос, потому что первый запрос вернет один общий префикс. Например, папка "foo" вернет один общий префикс "foo/".
Ответ 2
Теперь он отлично работает, используя этот код:
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);
});
Ответ 3
Я размещаю небольшой модуль, в котором перечисляется содержимое "папки", которую вы ему даете:
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)
}
};
};
Ответ 4
Как упоминалось в комментариях, 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 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);
});
Это проверит каждую клавишу, чтобы увидеть, содержит ли она/
Ответ 5
В качестве альтернативы вы можете использовать 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