如何使用Javascript删除AWS S3上的对象?
我想使用Javascript从AmazonS3中删除一个文件。我已经用Javascript上传了这个文件。有什么想法吗?您可以使用:如何使用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
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){})”解决了这个错误,但我不知道为什么。有什么想法吗?谢谢!这个答案对我帮助很大。