如何使用适用于Node.js的AWS开发工具包在s3上创build文件夹或密钥?

我正在使用适用于Node.js的AWS SDK在s3上创build文件夹或密钥。 我在谷歌search,但我什么都没有。 有谁知道如何使用适用于Node.js的AWS开发工具包在我的存储桶下创build文件夹? 以及如何检查这个文件夹是否存在于你的存储桶中?

如果您使用console.aws.amazon.com ,则可以轻松地在您的存储桶中创build一个文件夹。 似乎我没有弄清楚如何使用适用于Node.js的AWS开发工具包创build它?

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

您不需要在S3中预先创build文件夹结构。 即使汽车/福特/轿车/不存在,您也可以简单地使用key = cars / ford / sedans / focus.png。 在这种情况下:

  • putObject调用将在cars / ford / sedans / focus.png创build一个对象,但不会创build代表cars / ford / sedans /的中间文件夹结构的任何内容。

  • 实际的文件夹结构不存在,但通过在对listObjects的调用中使用delimiter = /来隐含 ,并且文件将在CommonPrefixes中返回,而文件将在Contents中返回。

  • 您将无法使用headObjecttesting轿车子文件夹,因为cars / ford / sedans /实际上并不存在(它不是一个对象)。 相反,你有两个select:

    • 调用带有prefix = cars / ford / sedans /的listObjects,然后在Contents或者中find它
    • 调用带前缀= cars / ford /,delimiter = /的listObjects,然后在CommonPrefixes中find它。

但是,如果您真的想要,可以创build一个代表文件夹的S3对象。 要在名为mybucket的存储桶中创build我的文件夹,可以使用bucket = mybucket和key = myfolder /执行putObject调用。 注意尾随的正斜杠。 在这种情况下:

  • 该文件夹实际上是一个零大小的对象,其关键字以/结尾。 请注意,如果你离开尾部/那么你会得到一个零大小的对象,似乎是一个文件,而不是一个文件夹。

  • 您可以通过使用bucket = mybucket和key = myfolder / subfolder /发出一个headObject调用来testingmyfolder / subfolder / mybucket中是否存在。

最后,请注意,您的文件夹分隔符可以是任何您喜欢的,例如+,因为它只是键的一部分,实际上并不是文件夹分隔符(没有文件夹)。 如果你喜欢,你可以改变你的文件夹分隔符从listObjects调用来调用。

从@ user2837831代码似乎不工作了,可能与新版本的JavaScript SDK。 所以我在这里添加我正在使用node.js在一个桶内创build一个文件夹的代码版本。 这适用于2.1.31 sdk。 重要的是在参数的关键值的末尾的“/” – 使用它认为你正试图创build一个文件夹而不是文件。

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

桶中的文件夹就是另一个桶。 所以你可以使用headBucket来检查它是否存在,如果没有,使用createBucket创build它。 像这样的东西:

 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-02-22 ====

正如评论中指出的那样,这是一个错误的领导。 在2013年,我想这确实导致了一个“文件夹”被创build(就S3 UI而言)。

如果您使用当前AWS开发工具包运行上述内容,则会在存储区“bucketA”的关键字“folderInBucketA”中创build一个空对象。 我不认为这对任何人都有用,所以请忽略这个答案

我发现我们不需要一个明确的目录创build调用了。

只是下面的作品为我自动创build一个目录层次结构,如我所需要的。

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