2015-06-09 164 views
19

我正在使用使用node.js的aws-sdk。我想列出指定文件夾中的圖像,例如This is the directory that i want to fetchAWS S3對象列表

我想列出所有文件和文件夾在這個位置但不是文件夾(圖像)的內容。 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

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是要在列出文件的文件夾的名稱桶的名稱。 S3沒有文件夾/文件等的概念......它只是有鍵 - 你可以使用/在鍵中模仿文件夾結構。 – Alex

+0

請顯示您目前的代碼 – Alex

+0

var AWS = require('aws-sdk'); AWS.config.update({accessKeyId:'mykey',secretAccessKey:'mysecret',region:'myregion'}); var s3 = new AWS.S3(); VAR PARAMS = { 剷鬥: 'mystore.in', 定界符: '', 前綴: 'S/5469b2f5b4292d22522e84e0/ms.files' }; (err,data){if(err)throw err; console.log(data); }); – 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

僅供參考 - 在'listObjects'之後,我在做'getObject',並且我發現''params''對象需要包含'Bucket'&'Key',你不能讓'Prefix'或'getObject'出錯。 '分隔符'也可能會導致問題,但我不記得確定。乾杯 – Jacksonkr

0

或者您可以使用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

8

我放了一個小module其中列出的 「文件夾」 內容的工作,你給它:

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

可以在S3 API PARAMS使用Prefix。我加入,我在項目中使用的例子: