使用节点 js aws-sdk 检查 S3 上是否存在文件夹



首先,我知道没有文件夹这样的东西,但是,我使用这个术语只是为了简单起见。现在我的存储桶中有很多对象。 对于某些文件夹,我可以使用 getObject 来查找它们是否存在,但对于其中的大多数文件夹,当我清楚地看到它们存在时,我会收到错误 No 这样的键。我还想说,我已经尝试过headObject,listObjectV2,但没有运气。

this is my params object
{
Bucket: bucket //bucket is defined in the program
Key: folder // defined in the program above
//example key - abc-1-1/00000N/30/2018.10.7.8/
//inside this folder are multiple files 
}

目标是找到该文件夹是否存在,并在此基础上进行一些处理。我看到很多关于这个问题的答案,建议headObject,getObjects等,但似乎都不起作用。

这是我的getObjects代码片段

params = {
Bucket: bucket,
Key: folder
}
s3.getObject(params, function (err, found) {
if (err){ 
console.log('bucket is'+bucket);
..........
.....
}
else{
....
}
..
});

我终于找到了这种情况的解决方法。如果您的应用程序要求您检查特定对象("文件夹"(是否存在,并在该对象("文件夹"(确实存在时继续操作,则可以使用此解决方案。我相信s3.getObject或s3.headObject的工作方式存在问题,无论如何这是解决方案。

1( 使用 s3.listObjectsV2 方法。

2( 检查响应的内容字段。如果为空,则您提供的前缀不存在。 这是代码片段

s3.listObjectsV2(params, function (err, found) {
if (err){ 
console.log(err);
errJson = {
'status': -1,
'message': 'Error while trying to list files'
};
callback(errJson);
} 
else {  
if (found.Contents.length === 0) {
errJson = {
'status': 0,
'message': 'Either the files are not present at s3 or the folder is incorrect '
}
callback(errJson);
}
else{
.....
}
....
});

为了检查"文件夹"是否存在,请检查存储桶中是否至少有一个对象的键以文件夹名称开头,加上尾部斜杠。

这可以使用 listObjectV2 方法完成,如下所示:

const s3 = ... // S3 client
const Bucket = 'mybucket';
const Prefix = 'myfolder/mysubfolder/';
const MaxKeys = 1; // If a single object is found, the folder exists.
const params = {
Bucket,
Prefix,
MaxKeys
};
s3.listObjectsV2(params, (err, data) => {
const folderExists = data.Contents.length > 0;
// (folderExists == true) if the folder exists
});

注意:上述内容使用文件夹的定义来表示至少有一个键以文件夹为前缀。

要检测"空文件夹",可以检查文件夹 +_$folder$后缀,如此处所述。

头对象怎么不工作?如果您在 s3 存储桶中搜索目录,它应该返回以下两件事之一:

  1. 如果请求的资源不存在(包括目录(,则状态代码为"NotFound"的错误。
  2. 包含有关对象的一些详细信息的响应。

下面你可以找到一个简单的实现,现在写一个"check"函数:

s3.headObject({Bucket: 'whatever-the-bucket-name-is', Key: 'directory/'}, (err, data) => {
if (err && err.code === 'NotFound') resolve(false)
else if (err) reject(err)
resolve(true)
})

希望这有帮助。

如果您正在检查存储桶是否存在,那么这是解决方案。

var AWS = require('aws-sdk');
var s3 = {
accessKeyId: '',
secretAccessKey: '',
bucketName: ''
}
AWS.config.update({
accessKeyId: s3.accessKeyId,
secretAccessKey: s3.secretAccessKey,
// region: {region} - Add if needed
});
var s3bucket = new AWS.S3({ params: { Bucket: s3.bucketName } });
var options = {
Bucket: s3.bucketName
};
function checkBucket(){
try {
await s3bucket.headBucket(options).promise();  
console.log('bucket exists');
// do the required operations here
} catch (err) {
if (err.statusCode === 404) {
return error("Bucket doesn't exists.");
}
}
}
(async() =>{
await checkBucket();
})()

最新更新