我想使用 aws-sdk
库来执行此操作。
我的 S3 存储桶上有一个名为“abcd/”的文件夹,其中包含 3 个文件(例如 abcd/1.jpg、abcd/2.jpg)。
我想将文件夹重命名为1234/
^ 我希望只有 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
, c
或d
是文件夹,但实际上不是。
现在,您无法更改对象的键,因为它是不可变的。您必须将当前 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/