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

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

Directory listing with Apache Mod_autoindex

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

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 файлов) в статическом веб-сайте Azure $web и установите index.html в качестве Index document name и Error document path в конфигурации статического веб-сайта.

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

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

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

Пока я вполне удовлетворен тем, что мой код может перечислять все BLOB-объекты на уровне листа, а также перечислять всекаталоги, если это не на уровне листьев.Вы можете взглянуть на список BLOB здесь и не стесняйтесь пойти на 'Просмотр исходного кода' , чтобы увидеть коды, которые я построил до сих пор.

Единственная проблемая сталкиваюсь с тем, что этот набор кода не может перечислять BLOB-объекты, если он не находится на уровне листа.Например, он не может перечислить эти большие двоичные объекты в 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 не будет эффективным в этом случае.

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

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

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

  fetch("https://cvworkshop.blob.core.windows.net/telaviv-bw/?restype=container&comp=list")
    .then(response => response.text())
    .then(str => new window.DOMParser().parseFromString(str, "text/xml"))
    .then(data => console.log(data));
0 голосов
/ 30 октября 2018

При перечислении BLOB-объектов есть опция с разделителем.Давайте перейдем к коду.

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

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

  1. result, содержит информацию о BLOB-объектах в корневом каталоге контейнера, например, 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-объектов .

...