В настоящее время я работаю над созданием некоторого набора кодов для отображения всех блоков в указанном контейнере Azure с использованием веб-интерфейса. Я ожидаю, что окончательный результат будет примерно таким:
Я начал с создания фиктивной учетной записи хранилища и заполнил ее некоторыми фиктивными файлами для меня, чтобы поиграть.
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 не будет эффективным в этом случае.
извините за длинное описание, но я просто хочу описать свою проблему как можно яснее :)
Там опция, называемая разделителем при перечислении капли. Давайте перейдем к коду.
blobService.listBlobsSegmentedWithPrefix('documents',null,null,{delimiter:'/'},(error,result,response)=>{
console.log(result);
console.log(response.body.EnumerationResults.Blobs.BlobPrefix);
})
С разделителем /
, операция листинга возвращает результаты двух частей.
result
, содержит информацию о блоках в корневом каталоге контейнера, например 201801_Review.pdf и т.д. в вашем случае. 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.
delimiter
отлично работает в моем случае, спасибо! В любом случае для этой опцииBlobPrefix
я уже реализовал свой код,getDir
его по URL-адресу сgetDir
функцииgetDir
(https://alicebob.z23.web.core.windows.net/{BlobPrefix})
getDir
(https://alicebob.z23.web.core.windows.net/{BlobPrefix})
чтобы я мог продолжить перечисление Остальные подкаталоги.