Перечисляет все BLOB-объекты внутри контейнера Azure с поддержкой на уровне каталогов с помощью веб-интерфейса

1

В настоящее время я работаю над созданием некоторого набора кодов для отображения всех блоков в указанном контейнере Azure с использованием веб-интерфейса. Я ожидаю, что окончательный результат будет примерно таким:

Изображение 174551

Я начал с создания фиктивной учетной записи хранилища и заполнил ее некоторыми фиктивными файлами для меня, чтобы поиграть.

https://alicebob.blob.core.windows.net/documents  
├── docx  
│   ├── 201801_Discussion.docx  
│   ├── 201802_Discussion.docx  
├── xlsx  
│   ├── 201801_Summary.xlsx  
│   ├── 201802_Summary.xlsx  
│   ├── 201803_Summary.xlsx  
├── 201801_Review.pdf  
├── 201802_Review.pdf  
├── 201803_Review.pdf  

Чтобы создать функцию перечисления файлов, я использую клиентскую библиотеку Azure Storage JavaScript здесь и поместил все необходимые коды (файлы .html и .js) в $web контейнер Azure Static $web и установил index.html качестве Index document name и Error document path в настройке веб-сайта Static.

https://alicebob.z23.web.core.windows.net/  
├── azure-storage.blob.min.js  
├── azure-storage.common.min.js  
├── index.html  

Проблема в том, что функция для создания списка - это либо listBlobsSegmentedWithPrefix либо listBlobDirectoriesSegmentedWithPrefix. Поэтому, в моем случае, я предполагаю, что это не сработает прямо, чтобы перечислить все капли и каталоги в хорошо структурированном/древовидном формате.

Мой текущий подход заключается в том, что я обманываю код, чтобы продолжать использовать listBlobDirectoriesSegmentedWithPrefix до тех пор, пока в списке больше нет каталога, а затем перейдите к списку, используя listBlobsSegmentedWithPrefix

До сих пор я вполне доволен тем, что мой код может отображать все Blobs на уровне листа, а также перечислять все каталоги, если он не находится на уровне листа. Вы можете взглянуть на список blob здесь и не стесняйтесь идти на "View Source", чтобы увидеть коды, которые я построил до сих пор.

Единственная проблема, с которой я сталкиваюсь, состоит в том, что этот набор кода не может отображать Blobs, если он не находится на уровне листа. Например, он не может перечислить эти капли на alicebob записи хранения alicebob:

├── 201801_Review.pdf  
├── 201802_Review.pdf  
├── 201803_Review.pdf  

Это ожидаемая проблема, поскольку я не запускаю listBlobsSegmentedWithPrefix если она не находится на уровне листа. Причина в том, что он будет выводить результат с чем-то вроде этого, чего я не хочу:

├── docx/201801_Discussion.docx  
├── docx/201802_Discussion.docx  
├── xlsx/201801_Summary.xlsx  
├── xlsx/201802_Summary.xlsx  
├── xlsx/201803_Summary.xlsx  
├── 201801_Review.pdf  
├── 201802_Review.pdf  
├── 201803_Review.pdf 

Любое предложение о том, как преодолеть эту проблему? Реальная реализация потребует огромного количества данных, поэтому я думаю, что простой if-then-else не будет эффективным в этом случае.

извините за длинное описание, но я просто хочу описать свою проблему как можно яснее :)

Теги:
azure
azure-storage
azure-storage-blobs

1 ответ

1

Там опция, называемая разделителем при перечислении капли. Давайте перейдем к коду.

blobService.listBlobsSegmentedWithPrefix('documents',null,null,{delimiter:'/'},(error,result,response)=>{
    console.log(result);
    console.log(response.body.EnumerationResults.Blobs.BlobPrefix);
})

С разделителем /, операция листинга возвращает результаты двух частей.

  1. result, содержит информацию о блоках в корневом каталоге контейнера, например 201801_Review.pdf и т.д. в вашем случае.
  2. BlobPrefix в тело ответа, содержит имена каталогов одного уровня с разделителем.

    [ { Name: 'docx/' }, { Name: 'xlsx/' } ]
    

Используйте BlobPrefix качестве prefix, мы можем продолжать перечислять содержимое текущего подкаталога.

    blobService.listBlobsSegmentedWithPrefix('documents','docx/',null,{delimiter:'/'},(error,result,response)=>{
        console.log(result);
        console.log(response.body.EnumerationResults.Blobs.BlobPrefix);
    }) 

В основном результат в 1-м случае достаточно, вам необязательно использовать BlobPrefix для рефакторинга кода. См. Дополнительную информацию в разделе Using a Delimiter to Traverse the Blob Namespace для списков blob.

  • 0
    Извините за задержку, да, опция delimiter отлично работает в моем случае, спасибо! В любом случае для этой опции BlobPrefix я уже реализовал свой код, getDir его по URL-адресу с getDir функции getDir (https://alicebob.z23.web.core.windows.net/{BlobPrefix}) getDir (https://alicebob.z23.web.core.windows.net/{BlobPrefix}) чтобы я мог продолжить перечисление Остальные подкаталоги.
  • 0
    @AndiAriffin Добро пожаловать. Не могли бы вы принять ответ для других?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню