Удаление подкаталогов из S3 из кода, определение параметра «разделитель», код в Groovy - PullRequest
4 голосов
/ 25 ноября 2011

У меня есть наблюдение, которое может помочь другим, работающим с S3, и вопрос ниже.Пример кода приведен в Groovy с использованием Java-библиотеки JetS3t, но эти понятия применимы к любому языку программирования.

Я нашел много документации здесь, в Slashdot и в других местах, где утверждается, что S3 не имеет концепции подкаталогов.в ведрах.Это в основном правда.Когда вы захотите удалить файлы, вы обнаружите, что сначала вы должны найти их, используя:

  //assume we are looking for all files in 'stuff' directory
  files = s3.listObjects(bucket, 'stuff/', null)

Теперь, если вы удалите эти файлы, у вас все равно останется нечто, очень похожее на подкаталог введро.Вы все еще увидите «материал /» в списке.Так что это заставило меня задуматься, правда ли, что на самом деле не было подкаталогов.Оказывается, это правда, что нет настоящих подкаталогов, но некоторые файлы маскируются как подкаталоги и отображаются в листинге.Немного поразмыслив, я определил, что это еще один объект S3 с именем ключа со специальной строкой _ $ folder $, добавленной к ключу.Таким образом, вы можете удалить это, выполнив следующее (предположив пример содержимого выше):

   s3.deleteObject(bucket, 'stuff_$folder$')

Теперь вы больше не увидите ни одного подкаталога для содержимого в этом сегменте.Хотя я не проверял это, я предполагаю, что вещи / папка уже должны быть пустыми, прежде чем пытаться удалить ключ 'stuff_ $ folder $'.Что меня удивляет, так это то, что во всех постах здесь это никогда не упоминается, поэтому у любого, кто пытается удалить весь подкаталог, вероятно, сам подкаталог все еще висит вокруг!:

   files = s3.listObjects(bucket, 'stuff', null) //note, no trailing slash

В результатах вы увидите папку stuff_ $ $.Моя проблема в том, что вы можете также получить другие объекты, которые начинаются с ключевого слова "stuff", но не содержатся в "подкаталоге".Поэтому вы должны быть осторожны.Поэтому я предпочитаю передавать в качестве ключа 'stuff /', а затем отдельно работать с объектом 'stuff_ $ folder_'.

Это подводит меня к последнему вопросуЯ не могу получить четкое объяснение того, что означает последний параметр в вызове listObjects (bucket, key, delimiter).Что именно является «разделителем».Кажется, он не означает «разделитель файлов» (как в «/»).Я искал и не могу найти пример, который иллюстрирует, что это значит или как он используется.Я хочу знать, потому что есть ли возможность улучшить полезность и гибкость списочных объектов, которые я хотел бы знать.Может ли кто-нибудь привести пример, иллюстрирующий использование и значение параметра delimiter?Я уверен, что это что-то простое, и я просто не могу найти хороший пример этого.

1 Ответ

1 голос
/ 20 ноября 2012

Разделитель - это неуклюжее имя. Это имеет больше смысла, если вы считаете это суффиксом. Из документации S3 - http://aws.amazon.com/releasenotes/Amazon-S3/213 или, если вы предпочитаете немного другое объяснение http://www.bucketexplorer.com/documentation/amazon-s3--search-on-objects-in-bucket.html

Группы ключей с общим префиксом, оканчивающиеся специальным Теперь этот префикс может быть свернут по этому префиксу для листинга. Это позволяет приложениям просматривать свои ключи иерархически, очень похоже на то, как вы будете перемещаться по каталогам в файловой системе.

Например, если у вас было ведро, содержащее следующие ключи (назван со встроенными разделителями слеша для имитации каталогов) фотографии / 2006 / index.html фотографии / 2006 / январь / img0001.jpg ... фотографии / 2006 / январь / img0999.jpg фотографии / 2006 / февраль / img1000.jpg ... A запрос списка с префиксом = "photos / 2006 /" и Delimiter = "/" вернется ключи и «подкаталоги» на уровне фотографий / 2006 (index.html, Январь, Февраль, ...) но не включает ни одну из клавиш .jpg более глубокие уровни.

Так что думайте об этом как о достаточном. Ваш разделитель может быть .html, .jpg или что-то в этом роде.

...