首先,我知道没有文件夹之类的东西,但是,我只是为了简单起见使用该术语。现在,我的存储桶中有很多物品。 对于某些文件夹,我可以使用getObject查找它们是否存在,但是对于大多数文件夹,当我清楚地看到它们存在时,会出现错误No such key。我还要说的是,即使没有运气,我也尝试过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{
....
}
..
});
答案 0 :(得分:0)
headObject如何无法正常工作?如果您在s3存储桶中搜索目录,则该目录应返回以下两项之一:
下面您可以找到现在的简单实现,以编写“检查”功能:
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)
})
希望这会有所帮助。
答案 1 :(得分:0)
我终于找到了解决此问题的方法。如果您的应用程序要求您检查特定对象(“文件夹”)是否存在,并在对象(“文件夹”)实际存在时继续进行操作,则可以使用此解决方案。我相信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{
.....
}
....
});
答案 2 :(得分:0)
为了检查是否存在“文件夹”,请检查存储桶中是否至少有一个对象,其键以文件夹的名称开头,并带有斜杠。
这可以使用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$
,如here所述。
答案 3 :(得分:-1)
如果您要检查存储桶是否存在,那么这是解决方案
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();
})()