2013-10-18 3 views
13

Node.js 용 AWS SDK를 사용하여 s3에 폴더 또는 키를 만듭니다. 나는 Google에서 검색했지만 아무 것도 얻지 못했습니다. 아무도 내가 Node.js 용 AWS SDK가있는 버킷 아래에 폴더를 만들 수 있는지 어떻게 알고 있습니까? 이 폴더가 양동이에 이미 있는지 확인할 수 있습니까?Node.js 용 AWS SDK를 사용하여 s3에 폴더 또는 키를 만드는 방법은 무엇입니까?

console.aws.amazon.com을 사용하는 경우 쉽게 버킷에 폴더를 만들 수 있습니다. Node.js 용 AWS SDK를 사용하여 생성하는 방법을 알지 못했던 것 같습니다.

답변

8

버킷의 폴더는 다른 버킷입니다. 따라서 headBucket을 사용하여 존재하는지 확인하고 createBucket으로 생성하십시오. 이런 식으로 뭔가 :

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

==== 업데이트

으로는 의견에서 지적 2017년 2월 22일 ====,이 미스 선도입니다. 2013 년에 나는 "폴더"가 만들어 질 것이라고 추측합니다 (S3 UI에 관한 한).

위의 코드를 현재 AWS SDK와 함께 실행하면 버킷 "bucketA"의 키 "folderInBucketA"에 빈 객체가 만들어집니다. 누구에게나 유용하다고 생각하지 않습니다. 을 무시하십시오.

+11

이 응답은 대부분 잘못되었습니다. 버킷의 폴더는 "다른 버킷"이 아닙니다. 그것은 양동이가 아닙니다. S3에 폴더가 없습니다. 양동이가 있으며 물건이 있습니다. 대부분의 사람들이 '폴더'라고 생각하는 것은 키가 /로 끝나는 실제 객체이거나 예를 들어 myfolder /이거나, 키가 myfolder /로 시작하는 객체가있는 것으로부터 유추 된 것입니다. – jarmod

+0

console.log ("버킷 생성 :"+ err? "FAIL": "SUCCESS"); 항상 "버킷 생성 : FAIL"을 반환합니다. console.log ("버킷 생성 :"+ (오류 : "실패": "성공")); – bpavlov

13

@ user2837831의 코드가 더 이상 작동하지 않는 것 같습니다. 아마도 새 버전의 javascript sdk가 필요합니다. 그래서 여기에 node.js.를 사용하여 버킷 안의 폴더를 생성하기 위해 사용하고있는 코드 버전을 추가하고 있습니다. 이것은 2.1.31 SDK에서 작동합니다. 중요한 것은 params의 Key 값 끝에있는 '/'입니다. 이는 폴더가 아니라 파일을 만들려고한다고 생각하는 것입니다.

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

나는 우리가 더 이상 명시 적 디렉토리 생성 호출을 필요로하지 않는다는 것을 찾을 수 있습니다.

나를 위해 다음 작업이 필요하며 자동으로 필요한 디렉터리 계층 구조를 만듭니다.

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에는 폴더 또는 파일이 없습니다. 양동이와 물건이 있습니다. 버킷은 객체를 저장하는 데 사용되고 객체는 데이터 (파일 일 수 있음) 및 메타 데이터 (데이터에 대한 정보)로 구성됩니다.

S3에서 폴더 구조를 미리 만들 필요가 없습니다. cars/ford/sedans /가 없어도 key = cars/ford/sedans/focus.png 개체를 넣을 수 있습니다. 이 경우 :/

  • putObject 전화 자동차/포드/세단/focus.png에서 객체를 생성하지만 그것은 자동차/포드/세단의 중간 폴더 구조를 나타내는 아무것도 생성하지 것입니다.

  • 실제 폴더 구조는 존재하지 않지만 listObjects에 대한 호출에서 구분 기호 = /를 사용하여 암시되며 폴더는 CommonPrefixes에서 반환되지만 파일은 내용으로 반환됩니다.

  • headObject을 사용하여 sedans 하위 폴더를 테스트 할 수 없습니다. 자동차/ford/sedans /가 실제로 존재하지 않기 때문에 (개체가 아닙니다).대신 두 가지 옵션이 있습니다 : 접두사 = 자동차/포드/세단과

    • 호출하고 ListObjects을/다음 내용에서 찾을 또는 접두사 = 자동차/포드/구분 기호와
    • 호출하고 ListObjects =/다음 찾기 CommonPrefixes에 있습니다.

그것은이다, 그러나, 당신이 정말로 원하는 경우, 폴더를 나타내는 S3 개체를 만들 수 있습니다. mybucket이라는 버킷에 myfolder를 만들려면 bucket = mybucket 및 key = myfolder /와 함께 putObject 호출을 생성 할 수 있습니다. 후행 슬래시에 유의하십시오. 이 경우 :

  • 이 폴더는 실제로는 키가 /로 끝나는 크기가 0 인 객체입니다. 꼬리말 /를 떠나면 폴더가 아니라 파일 인 것처럼 보이는 크기가 0 인 객체를 얻게됩니다.

  • mybucket에서 bucket = mybucket 및 key = myfolder/subfolder /로 headObject 호출을 실행하여 myfolder/subfolder /가 있는지 테스트 할 수 있습니다. 단순히 키의 일부이며 폴더 분리기 (아무 폴더가없는) 사실이 아니기 때문에

마지막으로, 폴더 구분 기호 예를 들어 당신이 좋아하는 무엇이든 될 수 있습니다 +. 원하는 경우 listObjects 호출에서 폴더 구분 기호를 변경할 수 있습니다.

관련 문제