2013-10-18 17 views
13

Tôi đang sử dụng SDK AWS cho Node.js để tạo thư mục hoặc khóa trên s3. Tôi đã tìm kiếm trên google, nhưng tôi không có gì. Có ai biết làm thế nào tôi có thể tạo một thư mục trong thùng của tôi với AWS SDK cho Node.js? và cách bạn có thể kiểm tra xem thư mục này có tồn tại trong nhóm của bạn chưa?Cách tạo thư mục hoặc khóa trên s3 bằng AWS SDK cho Node.js?

nếu bạn sử dụng console.aws.amazon.com, bạn có thể dễ dàng tạo một thư mục trong thùng của mình. có vẻ như tôi đã không tìm ra cách tạo nó bằng AWS SDK cho Node.js?

Trả lời

8

Thư mục trong nhóm chỉ là một nhóm khác. Vì vậy, bạn có thể sử dụng headBucket để kiểm tra xem nó có tồn tại không và tạo nó với createBucket nếu không. Một cái gì đó như thế này:

var AWS = require('aws-sdk'), 
    s3 = new AWS.S3(), 
    bucketFolder = 'bucketA/folderInBucketA'; 

s3.headBucket({Bucket:bucketFolder},function(err,data){ 
    if(err){ 
     s3.createBucket({Bucket:bucketFolder},function(err,data){ 
      if(err){ throw err; } 
      console.log("Bucket created"); 
     }); 
    } else { 
     console.log("Bucket exists and we have access"); 
    } 
}); 

Cập nhật ==== 2017/02/22 ====

Như đã chỉ ra trong các bình luận, đây là bỏ lỡ hàng đầu. Trong năm 2013 tôi đoán nó đã dẫn đến một "thư mục" được tạo ra (như xa như giao diện người dùng S3 có liên quan).

Nếu bạn chạy ở trên với SDK AWS hiện tại, nó sẽ tạo đối tượng trống tại khóa "folderInBucketA" trong nhóm "bucketA". Tôi không nghĩ rằng đó là hữu ích cho bất cứ ai như vậy xin vui lòng bỏ qua câu trả lời này.

+11

Phản hồi này phần lớn là không chính xác. Thư mục trong nhóm không phải là "chỉ một nhóm khác". Nó không phải là một cái xô. S3 không có thư mục. Nó có thùng và nó có đồ vật. Điều mà hầu hết mọi người coi là 'thư mục' là một đối tượng thực sự có khóa kết thúc bằng /, ví dụ myfolder /, hoặc đó là suy luận từ sự hiện diện của các đối tượng có khóa bắt đầu bằng myfolder /. – jarmod

+0

console.log ("tạo nhóm:" + err? "FAIL": "SUCCESS"); sẽ luôn trả về "tạo nhóm: FAIL". Nó phải là console.log ("tạo nhóm:" + (err? "FAIL": "THÀNH CÔNG")); – bpavlov

13

Mã từ @ user2837831 dường như không hoạt động nữa, có thể với phiên bản javascript sdk mới. Vì vậy, tôi đang thêm ở đây phiên bản mã mà tôi đang sử dụng để tạo một thư mục bên trong một nhóm bằng cách sử dụng node.js. Điều này làm việc với sdk 2.1.31. Điều quan trọng là '/' ở cuối giá trị Khóa trong các tham số - bằng cách sử dụng nó cho rằng bạn đang cố tạo thư mục chứ không phải tệp.

var AWS = require('aws-sdk'); 
AWS.config.region = 'us-east-1'; 
var s3Client = new AWS.S3(); 

var params = { Bucket: 'your_bucket_goes_here', Key: 'folderInBucket/', ACL: 'public-read', Body:'body does not matter' }; 

s3Client.upload(params, function (err, data) { 
if (err) { 
    console.log("Error creating the folder: ", err); 
    } else { 
    console.log("Successfully created a folder on S3"); 

    } 
}); 
2

Tôi thấy rằng chúng ta không cần một thư mục gọi tạo rõ ràng nữa.

Chỉ các tác vụ sau đây dành cho tôi và tự động tạo cấu trúc phân cấp thư mục như tôi cần.

var userFolder = 'your_bucket_name' + '/' + variable-with-dir-1-name + '/' + variable-with-dir-2-name; 
// IMPORTANT : No trailing '/' at the end of the last directory name 

AWS.config.region = 'us-east-1'; 

AWS.config.update({ 
    accessKeyId: 'YOUR_KEY_HERE', 
    secretAccessKey: 'your_secret_access_key_here' 
}); 

var bucket = new AWS.S3({ 
    params: { 
     Bucket: userFolder 
    } 
}); 

var contentToPost = { 
    Key: <<your_filename_here>>, 
    Body: <<your_file_here>>, 
    ContentEncoding: 'base64', 
    ContentType: <<your_file_content_type>>, 
    ServerSideEncryption: 'AES256' 
}; 

bucket.putObject(contentToPost, function (error, data) { 

    if (error) { 
     console.log("Error in posting Content [" + error + "]"); 
     return false; 
    } /* end if error */ 
    else { 
     console.log("Successfully posted Content"); 
    } /* end else error */ 
}) 
.on('httpUploadProgress',function (progress) { 
    // Log Progress Information 
    console.log(Math.round(progress.loaded/progress.total * 100) + '% done'); 
}); 
22

S3 không có thư mục hoặc tệp; nó có xô và đồ vật. Các nhóm được sử dụng để lưu trữ các đối tượng và các đối tượng bao gồm dữ liệu (có thể là một tệp) và siêu dữ liệu (thông tin về dữ liệu).

Bạn không cần phải tạo trước cấu trúc thư mục trong S3. Bạn có thể chỉ cần đặt một đối tượng với key = cars/ford/sedans/focus.png ngay cả khi ô tô/ford/sedans/không tồn tại. Trong trường hợp này:

  • cuộc gọi putObject sẽ tạo ra một đối tượng ở xe/ford/sedan/focus.png nhưng nó sẽ không tạo bất cứ điều gì đại diện cho cấu trúc thư mục trung gian của xe/ford/sedan /.

  • cấu trúc thư mục thực sự không tồn tại, nhưng được ngụ ý thông qua việc sử dụng dấu phân cách =/trong các cuộc gọi đến listObjects và thư mục sẽ được trả lại trong CommonPrefixes trong khi các tệp sẽ được trả lại trong Nội dung.

  • bạn sẽ không thể kiểm tra thư mục con sedan bằng cách sử dụng headObject vì ô tô/ford/sedan/không thực sự tồn tại (nó không phải là đối tượng).Thay vào đó bạn có hai lựa chọn:

    • listObjects cuộc gọi với prefix = xe/ford/sedan/và sau đó tìm thấy nó trong nội dung, hoặc
    • listObjects cuộc gọi với prefix = xe/ford /, delimiter =/và sau đó tìm nó trong CommonPrefixes.

Đó là, tuy nhiên, có thể tạo ra một đối tượng S3 đại diện cho một thư mục, nếu bạn thực sự muốn. Để tạo myfolder trong một thùng có tên mybucket, bạn có thể đưa ra một cuộc gọi putObject với bucket = mybucket và key = myfolder /. Lưu ý dấu gạch chéo phía trước. Trong trường hợp này:

  • thư mục thực sự là đối tượng có kích thước bằng không có khóa kết thúc bằng /. Lưu ý rằng nếu bạn rời khỏi dấu/sau đó bạn sẽ nhận được một đối tượng có kích thước bằng không xuất hiện là một tệp chứ không phải là một thư mục.

  • bạn có thể kiểm tra sự hiện diện của thư mục/thư mục con/trong mybucket bằng cách thực hiện cuộc gọi headObject với bucket = mybucket và key = myfolder/subfolder /.

Cuối cùng, lưu ý rằng dấu phân cách thư mục của bạn có thể được bất cứ điều gì mà bạn thích, ví dụ như +, bởi vì nó chỉ đơn giản là một phần của khóa và không phải là thực sự là một dấu phân cách thư mục (không có thư mục). Bạn có thể thay đổi dấu phân cách thư mục của bạn từ listObjects gọi để gọi nếu bạn muốn.

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