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

Eva*_*nss 7 amazon-s3 amazon-web-services node.js 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',
    };
Run Code Online (Sandbox Code Playgroud)

这有效,但如何将图像上传到存储桶中的特定文件夹?

Joh*_*ein 8

Amazon S3是一个平面存储系统,实际上并不使用文件夹.

而是,Key(filename)包括对象的完整路径,例如:

folder1/folder2/foo.txt
Run Code Online (Sandbox Code Playgroud)

Amazon S3管理控制台确实在文件夹中显示存储桶内容,但它们是一个人工构造(称为公共前缀),以便我们人们更容易理解.

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

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


Muh*_*man 6

您可以将 key 写为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();
      }
    });
  });
};
Run Code Online (Sandbox Code Playgroud)
await uploadToS3Bucket(imageFile,"folder1/folder2/image1.png");

Run Code Online (Sandbox Code Playgroud)