【问题标题】:How to copy the object from s3 to s3 using node.js如何使用 node.js 将对象从 s3 复制到 s3
【发布时间】:2018-04-07 10:06:17
【问题描述】:

我想知道如何使用 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 amazon-s3


【解决方案1】:

如果你只想复制一个对象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. 如果 source-bucket 中启用了版本控制,并且您想要复制密钥的特定版本,请同时调用 listObjectVersions API 并获取 Version-Id em> 对于每个 S3 密钥。

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

  3. 为每个 S3 Key 调用 copyObject 和分别在步骤 1 和步骤 2 中获得的 Version-Id。 Version-id 是可选的。

【讨论】:

  • 只是缺少 copySource 也必须包含存储桶。谢谢!
【解决方案2】:

s3.copyObject({ Bucket, CopySource: `/${Bucket}/${Key}?versionId=${versionId}`, Key, }).promise() 如果您确实传递了versionId,这就是它的样子。

我花了比我愿意承认的时间更长的时间。

【讨论】:

    【解决方案3】:

    请注意,如果文件名包含特殊字符,则需要 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"]。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2022-06-15
      • 2019-12-17
      • 2011-09-12
      相关资源
      最近更新 更多