使用aws-sdk模块通过node.js重命名s3对象

26

通过aws-sdk是否可以重命名S3上的对象?我找不到这样的方法,也许有一种临时解决方案...


2
除非它们已经更改,否则我认为您无法在S3上重命名对象。您需要将其复制到具有新名称的对象中,然后删除原始对象。 - barry-johnson
这是一个例子:https://gist.github.com/roparz/e9dedb2b8d421d75b989 - jarmod
@ barry-johnson :我希望不是这种情况。 - sami_analyst
@jarmod:我以前知道那个仓库,但我不想删除或复制该对象。 - sami_analyst
这是情况,你需要复制并删除。 - barry-johnson
好的,你可以回答这个问题。 - sami_analyst
2个回答

52

我想我会回答,因为没有人回答 - 这个应该行得通。

// create a new s3 object
var s3 = new AWS.S3();

var BUCKET_NAME = 'your-bucket-name';
var OLD_KEY = '/original-file.js';
var NEW_KEY = '/new-file.js';

// Copy the object to a new location
s3.copyObject({
  Bucket: BUCKET_NAME, 
  CopySource: `${BUCKET_NAME}${OLD_KEY}`, 
  Key: NEW_KEY
 })
  .promise()
  .then(() => 
    // Delete the old object
    s3.deleteObject({
      Bucket: BUCKET_NAME, 
      Key: OLD_KEY
    }).promise()
   )
  // Error handling is left up to reader
  .catch((e) => console.error(e))

尝试将文件“file+sign.txt”重命名为“filewithoutplus.txt”,将出现错误:“键不存在”。AWS在CopySource中使用加号存在问题。也许copyObject不是文件重命名的正确方法? - sytolk

5

这是对@nf071590答案的扩展,非常棒。

下面获取了一个存储桶的完整列表,然后将每个不是 .jpg 的图像名称更改为 .jpg

希望这能帮助到某人。 :)

const start = new Date()
const AWS = require('aws-sdk')
const state = {}

AWS.config.update({ region: 'ADD_REGION_HERE' })

try {
    var s3 = new AWS.S3();

    var BUCKET_NAME = 'ADD_BUCKET_NAME_HERE';

    var params = {
      Bucket: BUCKET_NAME,
      MaxKeys: 1000
    };
    s3.listObjects(params, function (err, data) {
      if (err) {
        console.log(err, err.stack); // an error occurred
      } else {
        console.log(data);
        data.Contents.forEach(image => {

          var OLD_KEY = image.Key
          var NEW_KEY = ''
          // split key
          var keyArray = image.Key.split('.')
          var keyArrayLength = keyArray.length
          console.log(keyArrayLength);
          var ext = keyArray[keyArrayLength - 1]
          // console.log(ext);
          if(ext != 'jpg') {
            console.log('Change this ext FROM: ', OLD_KEY)
            ext = 'jpg'
            if (keyArrayLength == 2) {
              NEW_KEY = `${keyArray[0]}.${ext}`
            } else if (keyArrayLength == 3) {
              NEW_KEY = `${keyArray[0]}.${keyArray[1]}.${ext}`
            } else if (keyArrayLength == 4) {
              NEW_KEY = `${keyArray[0]}.${keyArray[1]}.${keyArray[2]}.${ext}`
            }
            console.log('TO:: ', NEW_KEY);
            // Copy the object to a new location
            try {
              s3.copyObject({
                Bucket: BUCKET_NAME,
                CopySource: `${BUCKET_NAME}/${OLD_KEY}`,
                Key: NEW_KEY
              }).promise()
                .then((response) => {
                  console.log('Seemed to have worked??');
                  console.log(response);
                  // Delete the old object
                  s3.deleteObject({
                    Bucket: BUCKET_NAME,
                    Key: OLD_KEY
                  }).promise()
                })
                // Error handling is left up to reader
                .catch((e) => console.error(e))
            } catch (error) {
              console.log('error::', error);
            }
          }
        });
      } 
    });
} catch (err) {
  const end = new Date() - start
  let seconds = end / 1000
  state.seconds = seconds
  state.error = err
  state.status = "error"
  state.message = err.message
  console.log(err)
  console.log(state);
  return
}

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