如何使用AWS SDK for Node.js在s3上创建文件夹或密钥?

24 sdk amazon-web-services node.js

我正在使用AWS SDK for Node.js在s3上创建文件夹或密钥.我在谷歌搜索,但我一无所获.有谁知道我如何使用AWS SDK for Node.js在我的桶下创建一个文件夹?以及如何检查您的存储桶中是否存在此文件夹?

如果使用console.aws.amazon.com,您可以轻松地在存储桶中创建一个文件夹.似乎我没弄清楚如何使用AWS SDK for Node.js创建它?

jar*_*mod 49

S3没有文件夹或文件; 它有水桶和物体.存储桶用于存储对象,对象包括数据(可以是文件)和元数据(有关数据的信息).

您无需在S3中预先创建文件夹结构.即使cars/ford/sedans /不存在,您也可以简单地使用key = cars/ford/sedans/focus.png放置一个对象.在这种情况下:

  • putObject通话将创造汽车/福特/轿车/ focus.png的对象,但它会不会产生代表汽车/福特/轿车的中间文件夹结构什么/.

  • 实际的文件夹结构不存在,但是在您对listObjects的调用中使用delimiter =/暗示,并且文件将在Contents中返回,而CommonPrefix中将返回文件夹.

  • 你将无法使用headObject测试轿车子文件夹,因为cars/ford/sedans /实际上并不存在(它不是一个对象).相反,您有两个选项来查看它(逻辑上)是否存在:

    • 使用prefix = cars/ford/sedans /调用listObjects,然后在Contents中找到它,或者
    • 调用listObjects with prefix = cars/ford /,delimiter = /然后在CommonPrefixes中找到它.

但是,如果您确实需要,可以创建表示文件夹的S3对象.要在名为mybucket的存储桶中创建myfolder,可以使用bucket = mybucket,key = myfolder /和size 0发出putObject调用.请注意正斜杠.在这种情况下:

  • 该文件夹实际上是一个零大小的对象,其键以/结尾.请注意,如果您不使用尾随/那么您将获得一个零大小的对象,该对象看起来像是文件而不是文件夹.

  • 您现在可以通过发出带有bucket = mybucket和key = myfolder/subfolder /的headObject调用来测试myfolder /子文件夹/ mybucket中是否存在.

最后,请注意您的文件夹分隔符可以是您喜欢的任何内容,例如+,因为它只是密钥的一部分,实际上不是文件夹分隔符(没有文件夹).如果您愿意,可以通过listObjects调用来改变文件夹分隔符.


Liv*_*tea 19

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

    }
});
Run Code Online (Sandbox Code Playgroud)


Jam*_*ner 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");
     }
});
Run Code Online (Sandbox Code Playgroud)

====更新2017-02-22 ====

正如评论中指出的那样,这是领先的.在2013年,我猜它确实导致创建了一个"文件夹"(就S3 UI而言).

如果使用当前AWS SDK运行上述操作,它将在存储桶"bucketA"中的键"folderInBucketA"处创建一个空对象.我不认为这对任何人都有用,所以请忽略这个答案.

  • 这种反应在很大程度上是错 存储桶中的文件夹不是"只是另一个存储桶".它根本不是一个桶.S3没有文件夹.它有水桶,它有物体.大多数人认为'文件夹'是一个实际的对象,其键以/结尾,例如myfolder /,或者是来自其键以myfolder /开头的对象的推断. (18认同)
  • 29.06.2018-此请求返回错误:“桶名称不能包含正斜杠...” (2认同)

小智 6

我发现我们不再需要显式的目录创建调用。

下列内容对我有用,并根据需要自动创建目录层次结构。

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');
});
Run Code Online (Sandbox Code Playgroud)


Dav*_*ter 5

这非常简单,您可以使用以下命令来完成,只需记住尾部斜杠即可。

var AWS = require("aws-sdk");
var s3 = new AWS.S3();

var params = { 
  Bucket: "mybucket", 
  Key: "mykey/"
};

s3.putObject(params).promise();
Run Code Online (Sandbox Code Playgroud)