2015-06-09 23 views
19

Tôi đang sử dụng aws-sdk bằng cách sử dụng node.js. Tôi muốn liệt kê hình ảnh trong thư mục được chỉ định, ví dụ: This is the directory that i want to fetchdanh sách đối tượng AWS S3

Tôi muốn liệt kê tất cả các tệp và thư mục ở vị trí này nhưng không liệt kê nội dung thư mục (hình ảnh). Có list Object function trong aws-sdk nhưng nó cũng liệt kê tất cả các tệp lồng nhau.

Đây là mã:

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 không có khái niệm về thư mục/tập tin, vv… nó chỉ có các khóa - bạn có thể bắt chước cấu trúc thư mục bằng cách sử dụng/trong các phím. – Alex

+0

Vui lòng hiển thị mã nào bạn có cho đến nay – Alex

+0

var AWS = require ('aws-sdk'); AWS.config.update ({accessKeyId: 'mykey', bí mậtAccessKey: 'mysecret', region: 'myregion'}); var s3 = AWS.S3 mới(); var params = { Nhóm: 'mystore.in', Dấu phân cách: '', Tiền tố: 's/5469b2f5b4292d22522e84e0/ms.files' }; s3.listObjects (thông số, hàm (err, dữ liệu) { nếu (err) ném sai; console.log (dữ liệu); }); – Rohit

Trả lời

18

Folders là viển vông , nhưng S3 thì cung cấp cơ chế mô phỏng sự tồn tại của chúng.

Nếu bạn đặt Delimiter thành / thì mỗi tầng phản hồi cũng sẽ trả về một mảng "thư mục" tiếp theo mà bạn sẽ thêm vào tiền tố từ yêu cầu này, để truy xuất lớp tiếp theo.

Nếu Prefix của bạn là "thư mục", hãy thêm dấu gạch chéo theo sau. Nếu không, bạn sẽ thực hiện một yêu cầu không cần thiết, bởi vì yêu cầu đầu tiên sẽ trả về một tiền tố chung. Ví dụ: thư mục "foo" sẽ trả về một tiền tố phổ biến "foo /".

+0

Cảm ơn bạn Michael, Hiện tại nó hoạt động tốt. – Rohit

1

Như đã đề cập trong các ý kiến, S3 không "biết" về thư mục, chỉ phím. Bạn có thể bắt chước một cấu trúc thư mục với/trong các phím. Xem ở đây để biết thêm thông tin - http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html

Điều đó nói rằng, bạn có thể sửa đổi mã của bạn để một cái gì đó như thế này:

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

này sẽ kiểm tra mỗi phím để xem nếu nó có chứa một/

19

Đó là làm việc tốt bây giờ sử dụng mã này:

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 - Sau 'listObjects' Tôi đã làm' getObject' và tôi phát hiện ra rằng LONG WAY mà đối tượng 'params' cần chứa' Bucket' & 'Key', bạn không thể giữ' Tiền tố' hoặc 'getObject' sẽ bị lỗi . 'Dấu phân cách' cũng có thể gây ra vấn đề nhưng tôi không thể nhớ chắc chắn. Chúc mừng – Jacksonkr

0

Hoặc bạn có thể sử dụng thư viện minio-js khách hàng, mã nguồn mở của nó & tương thích với AWS S3 api.

Bạn chỉ có thể sử dụng ví dụ list-objects.js, tài liệu bổ sung có sẵn tại 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) 
}) 

Hy vọng điều đó sẽ hữu ích.

Disclaimer: Tôi làm việc cho Minio

8

tôi đặt lên một chút module trong đó liệt kê nội dung của một thư mục "" bạn cho nó:

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

sẽ in một cái gì đó như thế này:

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

Và rằng

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

sẽ in

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

Và đây là 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

Bạn có thể sử dụng Prefix trong params API s3. Tôi thêm một ví dụ mà tôi sử dụng trong một dự án:.

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

đây Bucket là tên của các xô chứa một thư mục và Folder là tên của thư mục mà bạn muốn liệt kê các file trong

Các vấn đề liên quan