如何使用Node.js将对象从S3复制到S3

26

这可能会有所帮助 - https://dev59.com/2l0Z5IYBdhLWcg3w4jhy - kawadhiya21
5个回答

34

如果您只想复制一个对象,请使用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
 });

如果您想递归地处理存储桶中的所有对象,则需要执行以下步骤:

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

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

    注意:如果未启用版本控制,则可以忽略步骤2。

  3. 分别为Step-1和Step-2中获取的每个S3密钥和相应的Version-Id调用copyObjectVersion-id是可选的。


2
只是缺少了copySource必须包含存储桶。谢谢! - 1mike12

33

请注意,如果文件名包含特殊字符,则需要使用encodeURI

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

7
这是真实而重要的!我刚刚陷入了这个陷阱。我想始终使用encodeURI对CopySource进行编码可能是一个好的实践。否则,它随时可能会影响到你。一个德语变音符就足以让我遭遇NetworkingError: Invalid character in header content ["x-amz-copy-source"]错误。 - jox
这是不正确的。应该使用encodeURIComponent,因为它会对所有AWS期望被编码的字符进行编码。使用encodeURI将无法访问包含例如+符号的文件键。 - biphobe

24

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

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();
    ....
}

8
s3.copyObject({
  Bucket,
  CopySource: `/${Bucket}/${Key}?versionId=${versionId}`,
  Key,
}).promise()

如果您传递了versionId,它会看起来像这样。

我花了比我想承认的时间才弄明白。


-1

试试这个:

const headCode = await S3.headObject(params).promise();

if (headCode) {
  const res = await S3.copyObject({
    CopySource: sourceBucket + '/' + sourceKey,
    Bucket: destinationBucket,
    Key: destinationKey
  }).promise();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接