我想知道如何使用node.js将对象从s3复制到s3。通过aws s3命令,可以按如下方式执行。
s3 cp --recursive s3://xx/yy s3://zz/aa
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property我参考了上述链接,但是不知道如何在node.js中完成此操作。
有什么想法吗?
我想知道如何使用node.js将对象从s3复制到s3。通过aws s3命令,可以按如下方式执行。
s3 cp --recursive s3://xx/yy s3://zz/aa
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property我参考了上述链接,但是不知道如何在node.js中完成此操作。
有什么想法吗?
如果您只想复制一个对象,请使用copyObject API。
var params = {
Bucket: "destinationbucket",
CopySource: "/sourcebucket/sourceKeyName",
Key: "targetKeyName"
};
s3.copyObject(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
如果您想递归地处理存储桶中的所有对象,则需要执行以下步骤:
使用listObjectsV2 API列出存储桶中所有对象的键。
如果在源存储桶中启用了版本控制,并且您想要复制密钥的特定版本,则还需要调用listObjectVersions API,以获取每个S3密钥的版本ID。
注意:如果未启用版本控制,则可以忽略步骤2。
分别为Step-1和Step-2中获取的每个S3密钥和相应的Version-Id
调用copyObject
。 Version-id
是可选的。
请注意,如果文件名包含特殊字符,则需要使用encodeURI
await S3.copyObject({
Bucket: bucketName,
CopySource: encodeURI(`/${sourceBucketName}/${filename}`),
Key: filename,
}).promise()
encodeURI
对CopySource进行编码可能是一个好的实践。否则,它随时可能会影响到你。一个德语变音符就足以让我遭遇NetworkingError: Invalid character in header content ["x-amz-copy-source"]
错误。 - joxencodeURIComponent
,因为它会对所有AWS期望被编码的字符进行编码。使用encodeURI
将无法访问包含例如+
符号的文件键。 - biphobe如果您想真正移动文件(而不仅是复制,还要删除源文件)
const moveAndDeleteFile = async (file,inputfolder,targetfolder) => {
const s3 = new AWS.S3();
const copyparams = {
Bucket : bucketname,
CopySource : bucketname + "/" + inputfolder + "/" + file,
Key : targetfolder + "/" + file
};
await s3.copyObject(copyparams).promise();
const deleteparams = {
Bucket : bucketname,
Key : inputfolder + "/" + file
};
await s3.deleteObject(deleteparams).promise();
....
}
s3.copyObject({
Bucket,
CopySource: `/${Bucket}/${Key}?versionId=${versionId}`,
Key,
}).promise()
如果您传递了versionId
,它会看起来像这样。
我花了比我想承认的时间才弄明白。
试试这个:
const headCode = await S3.headObject(params).promise();
if (headCode) {
const res = await S3.copyObject({
CopySource: sourceBucket + '/' + sourceKey,
Bucket: destinationBucket,
Key: destinationKey
}).promise();
}