node.js - 如何重命名文件夹?

标签 node.js amazon-s3 aws-sdk

我想使用 aws-sdk 库来执行此操作。

我的 S3 存储桶上有一个名为“abcd/”的文件夹,其中包含 3 个文件(例如 abcd/1.jpg、abcd/2.jpg)。

我想将文件夹重命名为1234/

enter image description here

^ 我希望只有 1234/

const awsMove = async (path) => {
  try {
    const s3 = new AWS.S3();
    const AWS_BUCKET = 'my-bucket-test';

    const copyParams = {
      Key: path.newPath,
      Bucket: AWS_BUCKET,
      CopySource: encodeURI(`/${AWS_BUCKET}/${path.oldPath}`),
    };
    await s3.copyObject(copyParams).promise();

    const deleteParams = {
      Key: path.oldPath,
      Bucket: AWS_BUCKET,
    };
    await s3.deleteObject(deleteParams).promise();
  } catch (err) {
    console.log(err);
  }
};

const changePath = { oldPath: 'abcd/', newPath: '1234/' };
awsMove(changePath);

上面的代码错误为“指定的 key 不存在”我做错了什么?

最佳答案

AWS S3 没有文件系统中的文件夹概念。你有一个bucket和一个 key标识存储在该位置的对象/文件。 key 的图案通常为 a/b/c/d/some_file以及它在 AWS 控制台上的显示方式,可能会给您这样的印象:a , b , cd是文件夹,但实际上不是。

现在,您无法更改对象的键,因为它是不可变的。您必须将当前 key 处现有的文件复制到新 key 并删除当前 key 处的文件。

这意味着重命名文件夹,比如 folder/与复制位于键 folder/* 处的所有文件相同并在newFolder/*创建新的。错误:

The specified key does not exist

表示您在从源复制以及删除期间未指定完整的对象键。正确的实现是列出 folder/* 处的所有文件。并一一复制并删除。所以,你的函数应该做这样的事情:

const awsMove = async (path) => {
  try {
    const s3 = new AWS.S3();
    const AWS_BUCKET = 'my-bucket-test';

    const listParams = { 
      Bucket: AWS_BUCKET,
      Delimiter: '/',
      Prefix: `${path.oldPath}`
    }

    await s3.listObjects(listParams, function (err, data) {
      if(err)throw err;

      data.Contents.forEach(async (elem) => {
        const copyParams = {
          Key: `${path.newPath}${elem.Key}`,
          Bucket: AWS_BUCKET,
          CopySource: encodeURI(`/${AWS_BUCKET}/${path.oldPath}/${elem.Key}`),
        };
        await s3.copyObject(copyParams).promise();

        const deleteParams = {
          Key: `${path.newPath}${elem.Key}`,
          Bucket: AWS_BUCKET,
        };
        await s3.deleteObject(deleteParams).promise();
      });
    }).promise();
  } catch (err) {
    console.log(err);
  }
};

关于node.js - 如何重命名文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73595932/

相关文章:

javascript - 覆盖或重载 node_module 名称路径

node.js - 今天 Node.js 连接中的 mongodb

node.js - 使用 Node 和 AngularJS 设置配置文件的自动化

node.js - 如何使用 npm 包进行部署

amazon-s3 - 为什么列出部分不与完整分段上传一起使用?

python - 如何使用 boto 将文件上传到 S3 存储桶中的目录

typescript - 将 TypeScript 与 'aws-sdk-mock' 一起使用

javascript - 是否可以通过 javascript 通过读取 json 文件而不是使用参数来更新安全组?

scala - 如何在 Scala 或 Java 中模拟或 stub AWS SDK S3 存储桶调用?

amazon-web-services - 动态创建 AWS IoT 主题