2015-06-09 18 views
19

मैं node.js. का उपयोग कर aws-sdk का उपयोग कर रहा हूँ। मैं निर्दिष्ट फ़ोल्डर में छवियों को सूचीबद्ध करना चाहता हूं उदा। This is the directory that i want to fetchएडब्ल्यूएस एस 3 ऑब्जेक्ट लिस्टिंग

मैं इस स्थान में सभी फ़ाइलों और फ़ोल्डर को सूचीबद्ध करना चाहता हूं लेकिन फ़ोल्डर (छवियों) सामग्री नहीं चाहता हूं। 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); 
}); 
+2

एस 3 में फ़ोल्डर्स/फाइल इत्यादि की धारणा नहीं है ... इसमें सिर्फ चाबियां हैं - आप चाबियों का उपयोग करके फ़ोल्डर संरचना का अनुकरण कर सकते हैं। – Alex

+0

कृपया दिखाएं कि आपके पास अब तक कौन सा कोड है – Alex

+0

var AWS = आवश्यकता ('aws-sdk'); AWS.config.update ({accessKeyId: 'mykey', secretAccessKey: 'mysecret', क्षेत्र: 'myregion'}); var s3 = new AWS.S3(); वर पैरामीटर = { बाल्टी: 'mystore.in', सीमान्तक: ', उपसर्ग: के/5469b2f5b4292d22522e84e0/ms.files' }; s3.listObjects (पैरा, फ़ंक्शन (गलती, डेटा) { अगर (त्रुटि) गलती फेंक दें; console.log (डेटा); }); – Rohit

उत्तर

18

फ़ोल्डर में छद्म है , लेकिन S3 उनके अस्तित्व को अनुकरण करने के लिए एक तंत्र प्रदान करता है।

आप Delimiter/ करने के लिए सेट है, तो प्रतिक्रियाओं की प्रत्येक श्रेणी के भी "फोल्डर," जो आप इस अनुरोध से उपसर्ग को जोड़ना होगा, अगले स्तर को पुनः प्राप्त करने के अगले स्तर की एक CommonPrefixes सरणी वापस आ जाएगी।

यदि आपका Prefix एक "फ़ोल्डर" है, तो पीछे की ओर स्लैश संलग्न करें। अन्यथा, आप एक अनावश्यक अनुरोध करेंगे, क्योंकि पहला अनुरोध एक आम उपसर्ग वापस करेगा। उदाहरण के लिए, फ़ोल्डर "foo" एक सामान्य उपसर्ग "foo /" लौटाएगा।

+0

के साथ वास्तव में क्या प्राप्त कर रहे हैं धन्यवाद माइकल, अब यह ठीक काम कर रहा है। – Rohit

1

टिप्पणी में उल्लेख किया है, 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); 
}); 

यह प्रत्येक कुंजी की जाँच करेगा देखने के लिए अगर यह होता है एक/

19

अब यह इस कोड का उपयोग ठीक काम कर रहा है:

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

एफवाईआई - 'सूची ऑब्जेक्ट्स' के बाद मैं 'getObject' कर रहा था और मुझे पता चला कि लंबे समय से' पैराम्स 'ऑब्जेक्ट में' बाल्टी 'और' कुंजी 'शामिल होना आवश्यक है, आप' उपसर्ग 'या' getObject' को त्रुटि नहीं दे सकते । 'डेलीमीटर' समस्याएं भी पैदा कर सकता है लेकिन मुझे निश्चित रूप से याद नहीं है। चियर्स – Jacksonkr

0

वैकल्पिक रूप से आप minio-js क्लाइंट लाइब्रेरी, इसके खुला स्रोत & एडब्ल्यूएस S3 एपीआई के साथ संगत का उपयोग कर सकते हैं।

आप बस 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

8

मैं एक छोटे से module जो एक "फ़ोल्डर" की सामग्री को सूचीबद्ध करता है डाल काम आप इसे दे:

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

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

कुछ इस तरह प्रिंट होगा

और

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

आप S3 एपीआई पैरामीटर में 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 है कि आप में फ़ाइलों को सूचीबद्ध करना चाहते हैं फ़ोल्डर का नाम है का नाम है

संबंधित मुद्दे