使用 AWS SDK 将文件上传到存储桶中的特定文件夹

Upload files to a specific folder in the bucket with AWS SDK

我正在使用节点的开发人员工具包将图像上传到 AWS S3:

const aws = require('aws-sdk');

const s3Bucket = process.env.S3_BUCKET;
    const s3 = new aws.S3({
      signatureVersion: 'v4',
      region: process.env.S3_REGION,
      accessKeyId: process.env.S3_ACCESS_KEY_ID,
      secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
    });

    const s3Params = {
      Bucket: s3Bucket,
      Key: filename,
      Expires: 60,
      ContentType: filetype,
      ACL: 'public-read',
    };

这可行,但我怎样才能将图像上传到存储桶中的特定文件夹?

实际上,我们没有S3中的文件夹对象和所有关于键名的信息。当您将喜欢的文件夹放在您的密钥名称中时,例如 "folder/myfile.txt," 您可以在 S3 浏览器上看到它作为一个文件夹。

类似问题: https://serverfault.com/questions/435827/what-is-the-difference-between-buckets-and-folders-in-amazon-s3

A​​mazon S3 是一个平面存储系统,实际上不使用文件夹。

相反,密钥(文件名)包含对象的完整路径,例如:

folder1/folder2/foo.txt

A​​mazon S3 管理控制台确实会显示文件夹中的存储桶内容,但它们是人为构造的(称为 公共前缀 ),以便于我们人类更容易理解。

因此,如果您想上传到特定文件夹,只需 在密钥中包含完整路径 即可(或者,更准确地说,假装工作!).

有趣的事实:您可以复制到不存在的文件夹,该文件夹将为您 'created'。然后,如果删除该对象,该文件夹将 'deleted',因为它实际上从未存在过!

A​​WS S3 没有文件夹结构。它显示为 S3 存储桶内的文件夹,但这是关键结构。 我在我的一项工作中使用了复制命令。正在 S3 存储桶文件夹中复制文件。

aws s3 cp myapp.zip s3://$S3_BUCKET_NAME/FolderName/FileName

例子

aws s3 cp myapp.zip s3://$S3_BUCKET_NAME/MyFolder/MyFileName

无需在 AWS S3 存储桶中创建任何文件夹,如果不存在,它将创建特定文件夹

上面的代码正在复制文件夹中的 myapp.zip 文件 - S3 存储桶的 MyFolder,文件名为 MyFileName

您可以将密钥写为 FULL PATH

const uploadToS3Bucket = (image, filePath) => {
  return new Promise((resolve, reject) => {
    let s3 = new AWS.S3({
      accessKeyId: process.env.S3_ACCESS_KEY,
      secretAccessKey: process.env.S3_SECRET_KEY,
      region: process.env.S3_REGION,
    });

    const bucketName = process.env.S3_BUCKET_NAME;

    let bucketPath = filePath;

    let params = {
      Bucket: bucketName,
      Key: bucketPath,
      Body: image,
    };
    s3.putObject(params, function (err, data) {
      if (err) {
        console.log(err);
      } else {
        resolve();
      }
    });
  });
};
await uploadToS3Bucket(imageFile,"folder1/folder2/image1.png");