如何使用Javascript删除AWS S3上的对象?

如何使用Javascript删除AWS S3上的对象?,javascript,amazon-web-services,amazon-s3,aws-sdk,amazon,Javascript,Amazon Web Services,Amazon S3,Aws Sdk,Amazon,我想使用Javascript从AmazonS3中删除一个文件。我已经用Javascript上传了这个文件。有什么想法吗?您可以使用: var AWS=require('AWS-sdk'); AWS.config.loadFromPath('./credentials ehl.json'); var s3=新的AWS.s3(); var params={Bucket:'your Bucket',Key:'your object'}; s3.deleteObject(参数、函数(错误、数据){ if

我想使用Javascript从AmazonS3中删除一个文件。我已经用Javascript上传了这个文件。有什么想法吗?

您可以使用:

var AWS=require('AWS-sdk');
AWS.config.loadFromPath('./credentials ehl.json');
var s3=新的AWS.s3();
var params={Bucket:'your Bucket',Key:'your object'};
s3.deleteObject(参数、函数(错误、数据){
if(err)console.log(err,err.stack);//error
else console.log();//已删除
});
请注意,S3不会在对象已删除时返回它。
您必须在使用getobject、headobject、waitfor等之前或之后进行检查。您可以使用如下构造:

var参数={
Bucket:'yourBucketName',
键:“文件名”
/* 
其中,“Key”的值等于“pathName1/pathName2/../pathNameN/fileName.ext”
-文件的完整路径名,开头不带“/”
*/
};
s3.deleteObject(参数、函数(错误、数据){
if(err)console.log(err,err.stack);//发生错误
else console.log(数据);//响应成功
});

不要忘记将其包装到承诺中

您可以使用
deleteObjects
API一次删除多个对象,而不是为每个要删除的键调用API。有助于节省时间和网络带宽

你可以做以下事情-

var deleteParam = {
    Bucket: 'bucket-name',
    Delete: {
        Objects: [
            {Key: 'a.txt'},
            {Key: 'b.txt'},
            {Key: 'c.txt'}
        ]
    }
};    
s3.deleteObjects(deleteParam, function(err, data) {
    if (err) console.log(err, err.stack);
    else console.log('delete', data);
});

有关参考信息,请参见-

在删除文件之前,您必须检查1)文件是否在bucket中,因为如果文件在bucket中不可用,并且使用
deleteObject
API,这不会引发任何错误2)
CORS配置
。通过使用
headObject
API给出bucket中的文件状态

AWS.config.update({
        accessKeyId: "*****",
        secretAccessKey: "****",
        region: region,
        version: "****"
    });
const s3 = new AWS.S3();

const params = {
        Bucket: s3BucketName,
        Key: "filename" //if any sub folder-> path/of/the/folder.ext
}
try {
    await s3.headObject(params).promise()
    console.log("File Found in S3")
    try {
        await s3.deleteObject(params).promise()
        console.log("file deleted Successfully")
    }
    catch (err) {
         console.log("ERROR in file Deleting : " + JSON.stringify(err))
    }
} catch (err) {
        console.log("File not Found ERROR : " + err.code)
}
由于参数是常量,因此最好将其与
const
一起使用。如果在s3中找不到该文件,则抛出错误
NotFound:null

如果要在bucket中应用任何操作,必须更改AWS中相应bucket中的
CORS配置
权限。用于更改权限
Bucket->permission->CORS配置
,并添加此代码

<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>


您可以点击此GitHub gist链接

删除-aws-s3.js:

var aws=require('aws-sdk');
var BUCKET='node-sdk-sample-7271';
aws.config.loadFromPath(require('path').join('uuu dirname',./aws config.json');
var s3=新的aws.s3();
变量参数={
Bucket:'node-sdk-sample-7271',
删除:{//必需
对象:[//必需
{
键:“foo.jpg”//必需
},
{
关键字:“示例图像--10.jpg”
}
],
},
};
s3.删除对象(参数、函数(错误、数据){
if(err)console.log(err,err.stack);//发生错误
else console.log(数据);//响应成功
});

S3返回DeleteMarker和VersionId。@这是因为您有一个版本化的存储桶。您需要删除所有对象版本(包括任何删除标记)才能完全删除该对象。如果使用async/await,则必须最后添加
.promise()
。例如:
等待s3.deleteObject(params).promise()
@AJB有没有办法一次删除文件的所有版本?或者应该逐版本执行?@shwz没有同时删除所有版本(和删除标记)的方法。我相信这是故意让它不可能意外删除对象。您需要首先收集所有VersionID和deleteMarkers,然后使用批处理或循环对它们调用deleteObject。这将删除单个文件。。。我用过它,它的功能是一样的,虽然当对象不存在时,我知道我已经迟到了,但这解决了我的问题。。。我不知道为什么。删除是使用以下语法为我工作的:“const deleteRes=await s3.deleteObject({Bucket:'some Bucket',Key:req.query.someKey})”;“在我开始将对象组织到文件夹之前,当这停止工作时。切换到:“s3.deleteObject({Bucket:'some Bucket',Key:req.query.someKey},function(err,data){})”解决了这个错误,但我不知道为什么。有什么想法吗?谢谢!这个答案对我帮助很大。