在同一亚马逊帐户上的存储桶之间移动文件

use*_*714 3 amazon-s3 node.js aws-lambda

我在 lambda 触发器中在 amazon s3 上移动文件时遇到了一些问题。我能够做到,s3.getObject但我认为我的问题是我在哪里做s3.putObject

var srcBucket = event.Records[0].s3.bucket.name;
var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
var s3params = {Bucket: srcBucket, Key: srcKey};

s3.getObject(s3params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else     console.log("Loaded " + data.ContentLength + " bytes"); // successful response

    var destinationpath = destinationbucket + '/moved_files/';
    console.log("Destination: " +destinationpath);

    var destiniation_name = destinationpath + str.split("/")[3];
    console.log(destiniation_name);
    var upparams = {Bucket: destinationbucket, Key: destiniation_name,ContentType: data.ContentType, Body: data.Stream};
    s3.putObject(upparams,function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log("upload response " +data); // successful response
        context.succeed('exit');
    });
});
Run Code Online (Sandbox Code Playgroud)

bir*_*aum 9

如果您只是在存储桶之间移动文件,则可以简单地使用S3.copyObject

var params = {
  CopySource: srcBucket + '/' + srcKey,
  Bucket: dstBucket,
  Key: dstKey
};

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)

这将在 S3 内部“移动”文件,这将比下载和上传文件快得多。此外,您只需要PUT为数据传输支付请求而无需支付任何费用。

  • copyObject 不会“移动”文件,而是复制它。来自 S3 文档:“创建已存储在 Amazon S3 中的对象的副本。” 移动是用户级操作,需要 2 个步骤: 1. copyObject(源 -> 目标) 2. deleteObject(源) (4认同)