2015-06-09 38 views
19

Sto usando aws-sdk utilizzando node.js. Voglio elencare le immagini nella cartella specificata, ad es. This is the directory that i want to fetchElenco oggetti AWS S3

Desidero elencare tutti i file e le cartelle in questa posizione ma non i contenuti delle cartelle (immagini). C'è lo list Object function in aws-sdk ma elenca anche tutti i file annidati.

Ecco il codice:

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

S3 non ha la nozione di cartelle/file ecc ... ha solo le chiavi - puoi imitare una struttura di cartelle usando/nei tasti. – Alex

+0

Mostra quale codice hai fino ad ora – Alex

+0

var AWS = require ('aws-sdk'); AWS.config.update ({accessKeyId: 'mykey', secretAccessKey: 'mysecret', regione: 'myregion'}); var s3 = new AWS.S3(); var params = { benna: 'mystore.in', delimitatori: '', prefisso: 's/5469b2f5b4292d22522e84e0/ms.files' }; s3.listObjects (params, function (err, data) { if (err) throw err; console.log (dati); }); – Rohit

risposta

18

cartelle sono illusorie , ma S3 fa fornire un meccanismo per emulare la loro esistenza.

Se si imposta Delimiter a / quindi ogni livello di risposte sarà anche restituire un CommonPrefixes serie di livello successivo di "cartelle", che si accodare al prefisso da questa richiesta, per recuperare il livello successivo.

Se il tuo Prefix è una "cartella", aggiungi una barra finale. Altrimenti, farai una richiesta non necessaria, perché la prima richiesta restituirà un prefisso comune. Ad esempio, la cartella "foo" restituirà un prefisso comune "foo /".

+0

Grazie Michael, ora funziona bene. – Rohit

1

Come accennato nei commenti, S3 non "sa" sulle cartelle, solo i tasti. È possibile imitare una struttura di cartelle con/nei tasti. Vedi qui per ulteriori informazioni - http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html

Detto questo, è possibile modificare il codice per qualcosa di simile:

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

Questo controllerà ogni tasto per vedere se contiene un/

19

Sta funzionando bene ora utilizzando questo codice:

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

FYI - Dopo 'listObjects' stavo facendo' getObject' e ho scoperto che LONG WAY che l'oggetto 'params' deve contenere' Bucket' e 'Key', non puoi mantenere' Prefix' o 'getObject' eseguirà un errore . 'Delimitatore' potrebbe causare problemi, ma non riesco a ricordare con certezza. Saluti – Jacksonkr

0

In alternativa è possibile utilizzare minio-js libreria client, il suo open source & compatibile con AWS S3 api.

È possibile utilizzare semplicemente l'esempio list-objects.js, sono disponibili ulteriori documenti allo 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) 
}) 

Spero che sia d'aiuto.

Disclaimer: io lavoro per Minio

8

ho messo un po 'module che elenca il contenuto di una "cartella" si dà:

s3ls({bucket: 'my-bucket-name'}).ls('/', console.log); 

stamperanno qualcosa di simile:

{ files: [ 'funny-cat-gifs-001.gif' ], 
    folders: [ 'folder/', 'folder2/' ] } 

E quello

s3ls({bucket: 'my-bucket-name'}).ls('/folder', console.log); 

stamperà

{ files: [ 'folder/cv.docx' ], 
    folders: [ 'folder/sub-folder/' ] } 

E qui è il 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) 
    } 
    }; 
}; 
1

È possibile utilizzare la Prefix in params API s3. Sto aggiungendo un esempio che ho usato in un progetto:.

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

Qui Bucket è il nome del secchio che contiene una cartella e Folder è il nome della cartella che si desidera elencare i file in

Problemi correlati