43

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

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

4

5 回答 5

89

S3 不是典型的文件系统。这是一个对象存储。它有桶和对象。桶用于存储对象,对象包括数据(基本上是文件)和元数据(有关文件的信息)。与传统文件系统相比,将 S3 存储桶视为驱动器而不是文件夹更为自然。

您无需在 S3 存储桶中预先创建文件夹结构。cars/ford/focus.png即使cars/ford/不存在,您也可以简单地放置带有键的对象。

在这种情况下,了解 API 级别发生的情况很有价值:

  • putObject调用将在 at 创建一个对象,但cars/ford/focus.png不会创建任何代表 or 的中间文件夹结构的cars/东西cars/ford/

  • 实际的文件夹结构不存在,但通过delimiter=/调用listObjects时隐含,返回文件夹 inCommonPrefixes和文件 in Contents

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

  1. listObjects使用 prefix=调用cars/ford/并找到它Contents
  2. listObjects使用 prefix= cars/, delimiter=调用/并找到它CommonPrefixes

如果您真的愿意,可以创建一个代表文件夹的 S3 对象。例如,AWS S3 控制台会执行此操作。要在名为 mybucket 的存储桶中创建 myfolder,您可以使用 bucket=mybucket、key=myfolder/ 和大小 0 发出 putObject 调用。注意尾部的正斜杠。

下面是使用 awscli 创建类似文件夹的对象的示例:

aws s3api put-object --bucket mybucket --key cars/ --content-length 0

在这种情况下:

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

  • 您现在可以通过使用 bucket=mybucket 和 key=cars/ 发出 headObject 调用来测试 mybucket 中是否存在 cars/。

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

于 2015-07-30T15:42:40.810 回答
28

@user2837831 的代码似乎不再起作用,可能是新版本的 javascript sdk。所以我在这里添加了我用来使用 node.js 在存储桶内创建文件夹的代码版本。这适用于 2.1.31 sdk。重要的是参数中 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");

    }
});
于 2015-05-28T12:38:03.437 回答
8

I find that we do not need an explicit directory creation call anymore.

Just the following works for me and automatically creates a directory hierarchy as I need.

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');
});
于 2015-07-24T18:12:58.323 回答
7

这真的很简单,您可以使用以下内容来完成,只需记住尾部斜杠即可。

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

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

s3.putObject(params).promise();
于 2020-10-27T12:52:57.247 回答
-2

在控制台中,首先生成的链接是存储桶创建的路径,其次是文件夹结构。

var AWS = require("aws-sdk");

var path = require('path')


// Set the region

AWS.config.update({

  region: "us-east-2",

  accessKeyId: "your aws  acces id ",

  secretAccessKey: "your secret access key"
});

s3 = new AWS.S3();

var bucketParams = {

  Bucket: "imageurrllll",

  ACL: "public-read"
};



s3.createBucket(bucketParams, function(err, data) {

  if (err) {

    console.log("Error", err);

  } else {

    console.log("Success", data.Location);

    var folder_name = 'root_folder'

    //this is for local folder data path

    var filePath = "./public/stylesheets/user.png"

    //var child_folder='child'

    var date = Date.now()

    var imgData = `${folder_name}_${date}/` +

      path.basename(filePath);


    var params = {

      Bucket: 'imageurrllll',

      Body: '', //here you can  give image data url from your local directory

      Key: imgData,

      ACL: 'public-read'
    };

    //in this section we are creating the folder structre 

    s3.upload(params, async function(err, aws_uploaded_url) {

      //handle error

      if (err) {

        console.log("Error", err);

      }

      //success
      else {

        console.log("Data Uploaded in:", aws_uploaded_url.Location)

      }

    })
  }

});
于 2020-01-09T18:32:01.747 回答