web-dev-qa-db-ja.com

Node.js用AWS SDKを使用してs3にフォルダーまたはキーを作成する方法

Node.js用AWS SDKを使用して、s3にフォルダーまたはキーを作成しています。グーグルで検索したが、何も得られなかった。 Node.js用AWS SDKを使用してバケットの下にフォルダを作成する方法を知っている人はいますか?そして、このフォルダがすでにバケットに存在するかどうかをどのように確認できますか?

console.aws.Amazon.comを使用すると、バケットにフォルダを簡単に作成できます。 Node.js用AWS SDKで作成する方法を理解できなかったようです。

23
user2896510

S3にはフォルダーまたはファイルがありません。バケットとオブジェクトがあります。バケットはオブジェクトの保存に使用され、オブジェクトはデータ(ファイルの場合もあります)とメタデータ(データに関する情報)で構成されます。

S3でフォルダー構造を事前に作成する必要はありません。 cars/ford /が存在しない場合でも、key = cars/ford/focus.pngでオブジェクトを単純に配置できます。この場合:

  • putObject 呼び出しは、cars/ford/focus.pngにオブジェクトを作成しますが、notcreate cars/ford /の中間フォルダー構造を表すもの。

  • 実際のフォルダー構造は存在しませんが、delimiter=/listObjects を呼び出すと、CommonPrefixesのフォルダーとContentsのファイルを返します。

  • cars/ford /は実際には存在しない(オブジェクトではない)ため、 headObject を使用してfordサブフォルダーをテストすることはできません。代わりに、(論理的に)存在するかどうかを確認する2つのオプションがあります。

    1. prefix = cars/ford /でlistObjectsを呼び出し、Contentsで検索します
    2. prefix = cars /、delimiter = /を指定してlistObjectsを呼び出し、CommonPrefixesで検索します

ただし、必要に応じて、フォルダーを表すS3オブジェクトを作成することもできます。たとえば、AWS S3コンソールがこれを行います。 mybucketという名前のバケットにmyfolderを作成するには、bucket = mybucket、key = myfolder /、およびサイズ0でputObject呼び出しを発行できます。末尾のスラッシュに注意してください。この場合:

  • フォルダは、実際にはキーが/で終わるサイズがゼロのオブジェクトです。末尾の/を省略すると、フォルダーではなくファイルのように見えるゼロサイズのオブジェクトを取得することに注意してください。

  • これで、bucket = mybucketおよびkey = myfolder/subfolder /を指定してheadObject呼び出しを発行することにより、mybucketにmyfolder/subfolder /が存在するかどうかをテストできます。

最後に、フォルダー区切り文字は、キーの一部であり、実際にはフォルダー区切り文字ではないため(フォルダーはありません)、たとえば+など、任意のフォルダー区切り文字を使用できることに注意してください。必要に応じて、listObjects呼び出しから呼び出しごとにフォルダーの区切り文字を変更できます。

44
jarmod

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

    }
});
18
Liviu Costea

バケット内のフォルダーは、単なる別のバケットです。したがって、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」に空のオブジェクトが作成されます。私はそれが誰にとっても有用ではないと思いますこの答えを無視してください

8
James Skinner

明示的なディレクトリ作成呼び出しはもう必要ないことがわかりました。

次のように動作し、必要に応じてディレクトリ階層を自動的に作成します。

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');
});
6
Nat