удалить папку из s3 nodejs - PullRequest
       27

удалить папку из s3 nodejs

0 голосов
/ 28 февраля 2019

Привет, ребята, я пытался удалить папку из s3 с содержимым, но deleteObjects не работал, поэтому я нашел этот скрипт в сети, и он отлично работает. Мой вопрос: почему он работает?Почему вы должны listObjects при удалении папки на s3, почему я не могу просто передать ему имя объекта?Почему не возникает ошибка, когда я пытаюсь удалить папку без предварительного перечисления объектов.

first attempt (doesnt work) 
  var filePath2 = "templates/" + key + "/test/";
    var toPush = { Key: filePath2 };
    deleteParams.Delete.Objects.push(toPush);
    console.log("deleteParams", deleteParams);
    console.log("deleteParams.Delete", deleteParams.Delete);

    const deleteResult = await s3.deleteObjects(deleteParams).promise();
    console.log("deleteResult", deleteResult);

имейте в виду: folderPath2 - это папка, в которой есть другие элементы, я не получаю ошибки, но все же ловушка нене срабатывает, и он говорит, что удалены и, чем имя папки.

вторая попытка (работает)

async function deleteFromS3(bucket, path) {
  const listParams = {
    Bucket: bucket,
    Prefix: path
  };

  const listedObjects = await s3.listObjectsV2(listParams).promise();
  console.log("listedObjects", listedObjects);
  if (listedObjects.Contents.length === 0) return;

  const deleteParams = {
    Bucket: bucket,
    Delete: { Objects: [] }
  };

  listedObjects.Contents.forEach(({ Key }) => {
    deleteParams.Delete.Objects.push({ Key });
  });
  console.log("deleteParams", deleteParams);

  const deleteResult = await s3.deleteObjects(deleteParams).promise();
  console.log("deleteResult", deleteResult);
  if (listedObjects.IsTruncated && deleteResult)
    await deleteFromS3(bucket, path);
}

чем я вызываю функцию вот так

const result = await deleteFromS3(myBucketName, folderPath);

1 Ответ

0 голосов
/ 28 февраля 2019

Папки не существуют в Amazon S3.Это плоская система хранения объектов, где имя файла (Key) для каждого объекта содержит полный путь.

В то время как Amazon S3 поддерживает концепцию общего префикса, которая можетзаставить вещи выглядеть так, как будто они находятся в папках / каталогах, папки на самом деле не существуют.

Например, вы можете выполнить команду, подобную этой:

aws s3 cp foo.txt s3://my-bucket/folder1/folder2/foo.txt

Это будет работать, даже еслипапки не существуют!Это просто хранение объекта с ключом folder1/folder2/foo.txt.

Если бы вы затем удалили этот объект, «папка» исчезла бы, потому что ни у какого объекта нет его в качестве пути.Это потому, что папка на самом деле никогда не существовала.

Иногда люди хотят, чтобы появилась пустая папка, поэтому они создают объект нулевой длины с тем же именем, что и папка, например, folder1/folder2/.

Итак, ваша первая программа не сработала, потому что она удалила «папку», которая не имеет ничего общего с удалением содержимого папки (поскольку отсутствует понятие «содержимое» папки).

...