如何使用node.js将对象从s3复制到s3

suk*_*kho 4 amazon-s3 node.js

我想知道如何使用node.js使用aws s3命令将对象从s3复制到s3,可以按以下方式执行。

s3 cp --recursive s3://xx/yy  s3://zz/aa
Run Code Online (Sandbox Code Playgroud)

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#copyObject-property

我指的是上面的链接,但我不知道如何使用node.js

任何的想法?

Tob*_*obi 12

如果你想真正移动(所以不仅仅是复制,还要删除源文件)

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();
    ....
}
Run Code Online (Sandbox Code Playgroud)


rad*_*erg 9

请注意,encodeURI如果文件名具有特殊字符,则需要

    await S3.copyObject({
        Bucket: bucketName,
        CopySource: encodeURI(`/${sourceBucketName}/${filename}`),
        Key: filename,
    }).promise()
Run Code Online (Sandbox Code Playgroud)

  • 这是真实且重要的!我刚刚陷入了这个陷阱。我想简单地始终对 CopySource 进行“encodeURI”是一个很好的做法。不然的话,它随时可能会袭击你。一个德语元音变音足以向我发出“网络错误:标题内容中的无效字符[“x-amz-copy-source”]`。 (7认同)

小智 8

s3.copyObject({
  Bucket,
  CopySource: `/${Bucket}/${Key}?versionId=${versionId}`,
  Key,
}).promise()
Run Code Online (Sandbox Code Playgroud)

如果你确实通过了,versionId这就是它的样子。

我花了比我愿意承认的更长的时间来弄清楚。


Mad*_*aju 5

如果只想复制一个对象,则为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
 });
Run Code Online (Sandbox Code Playgroud)

如果要对存储桶中的所有对象进行递归执行,则

  1. 使用listObjectsV2 API 列出存储桶中的所有对象键。

  2. 如果在源存储桶中启用了版本控制,并且您要复制密钥的特定版本,则也要调用listObjectVersions API并获取Version-Id每个S3密钥的。

    NOTE: If versioning is not enabled, then you can ignore STEP-2.

  3. 分别copyObject要求每个S3密钥和Version-Id在步骤1和步骤2中获得的。Version-id是可选的。

  • 只是缺少 copySource 也必须包含存储桶。谢谢! (2认同)