Javascript 从aws中删除多个图像

Javascript 从aws中删除多个图像,javascript,node.js,amazon-web-services,amazon-s3,Javascript,Node.js,Amazon Web Services,Amazon S3,下面是我用于从aws中删除多个图像的代码 AWS.config.update({ accessKeyId: process.env.ACCESS_KEY, secretAccessKey: process.env.SECRET_ACCESS_KEY }) const s3 = new AWS.S3({ params: { Bucket: process.env.BUCKET } }) 这是我从前端传递的用于删除图像的阵列 const array = [ 'http

下面是我用于从aws中删除多个图像的代码

AWS.config.update({
  accessKeyId: process.env.ACCESS_KEY,
  secretAccessKey: process.env.SECRET_ACCESS_KEY
})

const s3 = new AWS.S3({
  params: {
    Bucket: process.env.BUCKET
  }
})
这是我从前端传递的用于删除图像的阵列

const array = [
  'https://s3.amazonaws.com/lgfit/picture/5b55a7a6c316686bbbbc8120.jpg',
  'https://s3.amazonaws.com/lgfit/picture/5b4c3ca0097c915e38d0d21515-09-2018_12_13_48.jpg'
]
这里我在aws的
deleteObject
中传递图像

var options = {
  Bucket: process.env.BUCKET,
  Delete: {
    Objects: [{
      Key: array
    }],
  }
}
return new Bluebird((resolve) => {
  s3.deleteObject(options, function (err,data){
    console.log(err)
    console.log(data)
  })
})
我得到了以下错误

{ MultipleValidationErrors: There were 2 validation errors:
* MissingRequiredParameter: Missing required key 'Key' in params
* UnexpectedParameter: Unexpected key 'Delete' found in params
    at ParamValidator.validate (/home/user/ashish/FitnessApp/Fitness-New-one/fitnessapp-backend/node_modules/aws-sdk/lib/param_validator.js:40:28)
    at Request.VALIDATE_PARAMETERS (/home/user/ashish/FitnessApp/Fitness-New-one/fitnessapp-backend/node_modules/aws-sdk/lib/event_listeners.js:108:42

请帮助我在这里做错了什么

由于您试图使用单个HTTP请求删除多个对象,因此应该使用s3.deleteObjects()而不是s3.deleteObject()。您可以尝试以下操作:

var options = {
  Bucket: process.env.BUCKET,
  Delete: {
    Objects: [{
      Key: array[0]
    },
    {
      Key: array[1]
    }],
  }
}
return new Bluebird((resolve) => {
  s3.deleteObjects(options, function (err,data){
    console.log(err)
    console.log(data)
  })
})

由于您试图使用单个HTTP请求删除多个对象,因此应该使用s3.deleteObjects()而不是s3.deleteObject()。您可以尝试以下操作:

var options = {
  Bucket: process.env.BUCKET,
  Delete: {
    Objects: [{
      Key: array[0]
    },
    {
      Key: array[1]
    }],
  }
}
return new Bluebird((resolve) => {
  s3.deleteObjects(options, function (err,data){
    console.log(err)
    console.log(data)
  })
})

代码中有两个错误

  • 您使用了错误的SDK方法
  • 您正在以错误的格式传递参数
    deleteObjects
    是删除多个对象的方法 及
    Delete.Objects
    expect
    key:string
    但是您正在给
    key:array
    所以您需要从数组生成对象。我假设
    lgfit
    就是你的桶

    const params = {
        Bucket: process.env.BUCKET,
        Delete: {
            Objects: [{
                    Key: "picture/5b55a7a6c316686bbbbc8120.jpg"
                },
                {
                    Key: "picture/5b4c3ca0097c915e38d0d21515-09-2018_12_13_48.jpg"
                }
            ],
            Quiet: false
        }
    };
    return new Bluebird((resolve) => {
        s3.deleteObjects(params, function (err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else console.log(data); // successful response
            /*
            data = {
            Deleted: [
                {
            DeleteMarker: true, 
            DeleteMarkerVersionId: "A._w1z6EFiCF5uhtQMDal9JDkID9tQ7F", 
            Key: "objectkey1"
            }, 
                {
            DeleteMarker: true, 
            DeleteMarkerVersionId: "iOd_ORxhkKe_e8G8_oSGxt2PjsCZKlkt", 
            Key: "objectkey2"
            }
            ]
            }
            */
        });
    });
    

    代码中有两个错误

  • 您使用了错误的SDK方法
  • 您正在以错误的格式传递参数
    deleteObjects
    是删除多个对象的方法 及
    Delete.Objects
    expect
    key:string
    但是您正在给
    key:array
    所以您需要从数组生成对象。我假设
    lgfit
    就是你的桶

    const params = {
        Bucket: process.env.BUCKET,
        Delete: {
            Objects: [{
                    Key: "picture/5b55a7a6c316686bbbbc8120.jpg"
                },
                {
                    Key: "picture/5b4c3ca0097c915e38d0d21515-09-2018_12_13_48.jpg"
                }
            ],
            Quiet: false
        }
    };
    return new Bluebird((resolve) => {
        s3.deleteObjects(params, function (err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else console.log(data); // successful response
            /*
            data = {
            Deleted: [
                {
            DeleteMarker: true, 
            DeleteMarkerVersionId: "A._w1z6EFiCF5uhtQMDal9JDkID9tQ7F", 
            Key: "objectkey1"
            }, 
                {
            DeleteMarker: true, 
            DeleteMarkerVersionId: "iOd_ORxhkKe_e8G8_oSGxt2PjsCZKlkt", 
            Key: "objectkey2"
            }
            ]
            }
            */
        });
    });
    

    将数组更改为对象

    const imgList = [
      {Key: 'picture/5b55a7a6c316686bbbbc8120.jpg'},
      {Key: 'picture/5b4c3ca0097c915e38d0d21515-09-2018_12_13_48.jpg'}
    ]
    
    将数组设置为参数中的对象值

    const params = {
        Bucket: process.env.BUCKET,
        Delete: {
            Objects: imgList,
            Quiet: false
        }
    };
    
    return new Bluebird((resolve) => {
        s3.deleteObjects(params, function (err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else console.log(data); // successful response
        });
    });
    
    现在删除对象

    const params = {
        Bucket: process.env.BUCKET,
        Delete: {
            Objects: imgList,
            Quiet: false
        }
    };
    
    return new Bluebird((resolve) => {
        s3.deleteObjects(params, function (err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else console.log(data); // successful response
        });
    });
    

    将数组更改为对象

    const imgList = [
      {Key: 'picture/5b55a7a6c316686bbbbc8120.jpg'},
      {Key: 'picture/5b4c3ca0097c915e38d0d21515-09-2018_12_13_48.jpg'}
    ]
    
    将数组设置为参数中的对象值

    const params = {
        Bucket: process.env.BUCKET,
        Delete: {
            Objects: imgList,
            Quiet: false
        }
    };
    
    return new Bluebird((resolve) => {
        s3.deleteObjects(params, function (err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else console.log(data); // successful response
        });
    });
    
    现在删除对象

    const params = {
        Bucket: process.env.BUCKET,
        Delete: {
            Objects: imgList,
            Quiet: false
        }
    };
    
    return new Bluebird((resolve) => {
        s3.deleteObjects(params, function (err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else console.log(data); // successful response
        });
    });
    

    现在得到这个
    InvalidParameterType:应该是params.Delete.Objects[0]。键应该是字符串
    我认为现在的问题是,您提供的键是一个数组,其中键应该是字符串,而对象应该是一个数组,数组中有多个键作为位置图像对象。看看这里:有趣的是,s3.deleteObject()和s3.deleteObjects()之间的细微差别让我即使在梦中也能思考。我太傻了,谢谢@AshishNow收到这个
    InvalidParameterType:需要参数。Delete.Objects[0]。键是字符串
    我想现在的问题是你提供的键是一个数组,其中键应该是字符串,对象应该是一个数组,数组中有多个键作为位置图像对象。看看这里:有趣的是,s3.deleteObject()和s3.deleteObjects()之间的细微差别让我即使在梦中也能思考。我真傻,谢谢你@ashishThank!!!它工作完美!!!所以我需要从图像中删除前缀?是的,因为您已经提供了bucket name,所以您需要给出该bucket根的相对路径。这里什么是
    Quiet:false
    ?多对象删除操作支持两种响应模式;冗长而安静。默认情况下,该操作使用详细模式,其中响应包括删除请求中每个键的结果。在安静模式下,响应仅包括删除操作遇到错误的键。如果删除成功,操作不会在响应正文中返回任何有关删除的信息。谢谢!!!它工作完美!!!所以我需要从图像中删除前缀?是的,因为您已经提供了bucket name,所以您需要给出该bucket根的相对路径。这里什么是
    Quiet:false
    ?多对象删除操作支持两种响应模式;冗长而安静。默认情况下,该操作使用详细模式,其中响应包括删除请求中每个键的结果。在安静模式下,响应仅包括删除操作遇到错误的键。对于成功的删除,操作不会在响应正文中返回有关删除的任何信息。