Estoy usando aws-sdk usando node.js. Quiero enumerar las imágenes en la carpeta especificada, por ejemplo
Quiero enumerar todos los archivos y carpetas en esta ubicación, pero no el contenido de carpetas (imágenes). Hay una función de lista de objetos en aws-sdk, pero también enumera todos los archivos anidados.
Aquí está el código:
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); });Está funcionando bien ahora usando este código:
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); });Las carpetas son ilusorias, pero S3 proporciona un mecanismo para emular su existencia.
Si establece Delimiter en / , cada nivel de respuestas también devolverá una matriz CommonPrefixes del siguiente nivel de "carpetas", que agregará al prefijo de esta solicitud, para recuperar el siguiente nivel.
Si su Prefix es una "carpeta", agregue una barra inclinada al final. De lo contrario, realizará una solicitud innecesaria, porque la primera solicitud devolverá un prefijo común. Por ejemplo, la carpeta "foo" devolverá un prefijo común "foo/".
Puse un pequeño módulo que enumera el contenido de una "carpeta" que le das:
s3ls({bucket: 'my-bucket-name'}).ls('/', console.log);imprimirá algo como esto:
{ files: [ 'funny-cat-gifs-001.gif' ], folders: [ 'folder/', 'folder2/' ] }Y eso
s3ls({bucket: 'my-bucket-name'}).ls('/folder', console.log);imprimirá
{ files: [ 'folder/cv.docx' ], folders: [ 'folder/sub-folder/' ] }UPD: la última versión admite la interfaz async/await Promise:
const { files, folders } = await lister.ls("/my-folder/subfolder/"); Y aquí está el 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) } }; };