【问题标题】:How to create folder or key on s3 using AWS SDK for Node.js?如何使用 AWS SDK for Node.js 在 s3 上创建文件夹或密钥?
【发布时间】:2021-02-21 03:31:47
【问题描述】:

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

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

【问题讨论】:

    标签: node.js amazon-web-services sdk


    【解决方案1】:

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

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

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

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

    • 实际的文件夹结构并不存在,而是通过delimiter=/ 隐含在调用listObjects 时,返回CommonPrefixes 中的文件夹和Contents 中的文件。

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

    1. 使用前缀=cars/ford/ 调用listObjects 并在Contents 中找到它
    2. 使用前缀=cars/,分隔符=/ 调用listObjects 并在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 中是否存在汽车。

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

    【讨论】:

      【解决方案2】:

      @user2837831 的代码似乎不再起作用,可能是新版本的 javascript sdk。因此,我在此处添加了用于使用 node.js 在存储桶内创建文件夹的代码版本。这适用于 2.1.31 sdk。重要的是参数中键值末尾的“/” - 使用它认为您正在尝试创建文件夹而不是文件。

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

      【讨论】:

      • 您好,我们可以将prefix 放在 params 对象上,以便它可以上传到存储桶中的特定文件夹吗?
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        var AWS = require("aws-sdk");
        var s3 = new AWS.S3();
        
        var params = { 
          Bucket: "mybucket", 
          Key: "mykey/"
        };
        
        s3.putObject(params).promise();
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2022-01-26
            • 2012-12-31
            • 2020-11-02
            • 2021-01-08
            • 2019-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-14
            相关资源
            最近更新 更多