nodejs - ¿Cómo puedo eliminar la carpeta en s3 con node.js?
s3 putobject params (3)
Sí, lo sé. No hay concepto de carpeta en el almacenamiento s3. pero realmente quiero eliminar una carpeta específica de s3 con node.js. Probé dos soluciones, pero las dos no funcionaron. Mi código se encuentra a continuación: Solución 1: Eliminar la carpeta directamente.
var key=''level/folder1/folder2/'';
var strReturn;
var params = {Bucket: MyBucket};
var s3 = new AWS.S3(params);
s3.client.listObjects({
Bucket: MyBucket,
Key: key
}, function (err, data) {
if(err){
strReturn="{/"status/":/"1/"}";
}else{
strReturn=+"{/"status/":/"0/"}";
}
res.send(returnJson);
console.log(''error:''+err+'' data:''+JSON.stringify(data));
});
En realidad, tengo muchos archivos en folder2. Puedo eliminar un solo archivo de la carpeta2 si defino una clave como esta: var key = ''level / folder1 / folder2 / file1.txt'', pero no funcionó cuando eliminé una carpeta (key = ''level / folder1 / folder2 / ''). Solución 2: Intenté establecer la caducidad de un objeto cuando cargué este archivo o carpeta en s3. El código está abajo:
s3.client.putObject({
Bucket: Camera_Bucket,
Key: key,
ACL:''public-read'',
Expires: 60
}
Pero tampoco lo hizo. Después de terminar de subir, comprobé las propiedades de ese archivo. mostró que no había nada de valor para la fecha de caducidad:
Expiry Date:none
Expiration Rule:N/A
¿Cómo puedo eliminar la carpeta en s3 con node.js?
Aquí hay una implementación en ES7 con una función async
y utilizando listObjectsV2
(la API de objetos de lista revisada):
async function emptyS3Directory(bucket, dir) {
const listParams = {
Bucket: bucket,
Prefix: dir
};
const listedObjects = await s3.listObjectsV2(listParams).promise();
if (listedObjects.Contents.length === 0) return;
const deleteParams = {
Bucket: bucket,
Delete: { Objects: [] }
};
listedObjects.Contents.forEach(({ Key }) => {
deleteParams.Delete.Objects.push({ Key });
});
await s3.deleteObjects(deleteParams).promise();
if (listedObjects.IsTruncated) await emptyS3Directory(bucket, dir);
}
Para llamarlo:
await emptyS3Directory(process.env.S3_BUCKET, ''images/'')
De acuerdo con la respuesta aceptada, he creado la función promesa devuelta, para que pueda encadenarla
function emptyBucket(bucketName){
let currentData;
let params = {
Bucket: bucketName,
Prefix: ''folder/''
};
return S3.listObjects(params).promise().then(data => {
if (data.Contents.length === 0) {
throw new Error(''List of objects empty.'');
}
currentData = data;
params = {Bucket: bucketName};
params.Delete = {Objects:[]};
currentData.Contents.forEach(content => {
params.Delete.Objects.push({Key: content.Key});
});
return S3.deleteObjects(params).promise();
}).then(() => {
if (currentData.Contents.length === 1000) {
emptyBucket(bucketName, callback);
} else {
return true;
}
});
}
Puede usar el módulo aws-sdk para eliminar carpetas. Como puede eliminar una carpeta cuando está vacía, debe eliminar los archivos que contiene. Lo estoy haciendo así.
function emptyBucket(bucketName,callback){
var params = {
Bucket: bucketName,
Prefix: ''folder/''
};
s3.listObjects(params, function(err, data) {
if (err) return callback(err);
if (data.Contents.length == 0) callback();
params = {Bucket: bucketName};
params.Delete = {Objects:[]};
data.Contents.forEach(function(content) {
params.Delete.Objects.push({Key: content.Key});
});
s3.deleteObjects(params, function(err, data) {
if (err) return callback(err);
if(data.Contents.length == 1000)emptyBucket(bucketName,callback);
else callback();
});
});
}