Подтвердить что ты не робот

Как запросить Cloud Blob на Windows Azure Storage

Я использую Microsoft.WindowsAzure.StorageClient для управления блоками на Azure-хранилище. Я пришел к тому, что пользователю нужно перечислить загруженные файлы и изменить/удалить их. Так как в одном контейнере есть много файлов, то лучший способ запросить службы хранения azure для возврата только желаемых файлов. Кроме того, я хотел бы иметь возможность возвращать только определенное количество блоков, чтобы я мог реализовать подкачку.

В CloudBlobContainer существует метод ListBlobs, но похоже, что он возвращает все капли в контейнере. Это не сработает для меня.

Я много искал эту тему и не нашел ничего полезного. Эта ссылка показывает только основы.

--------- EDIT

Мой нижеприведенный ответ не извлекает блобы лениво, но он извлекает все капли в контейнере, а затем фильтрует результат. В настоящее время нет решения для извлечения блобов лениво.

4b9b3361

Ответ 1

То, что я понял о хранилище BLOB в Windows Azure, это то, что он голый. Как в чрезвычайно голых костях. Вы должны использовать его только для хранения документов и связанных метаданных, а затем для получения отдельных капель по идентификатору.

Недавно я перенес приложение из MongoDB в хранилище Windows Azure blob. Исходя из MongoDB, я ожидал кучу различных эффективных способов получения документов. После миграции я теперь полагаюсь на традиционные RDBMS и ElasticSearch для хранения информации о блобе более удобным для поиска способом.

Очень жаль, что хранилище памяти Windows Azure настолько ограничено. Надеюсь, что в будущем мы увидим много улучшенные возможности поиска (например, поиск по метаданным, свойствам, регулярному выражению blob и т.д.). Кроме того, индексы, основанные на карте/сокращении, были бы потрясающими. Microsoft имеет возможность преобразовать много людей из других систем хранения документов, если они это сделали.

Ответ 2

Метод ListBlobs извлекает капли в этом контейнере lazily. Таким образом, вы можете писать запросы против этого метода, которые не выполняются до тех пор, пока вы не зациклируете (или не материализуете объекты с помощью ToList или какой-либо другой метод).

Вещи станут более ясными с несколькими примерами. Для тех, кто не знает, как получить ссылку на контейнер в вашей учетной записи Azure Storage, я рекомендую этот учебник.

Заказ по последней измененной дате и номер страницы 2 (10 блоков на страницу):

blobContainer.ListBlobs().OfType<CloudBlob>()
         .OrderByDescending(b=>b.Properties.LastModified).Skip(10).Take(10);

Получить определенный тип файлов. Это будет работать, если вы установили ContentType во время загрузки (что я настоятельно рекомендую вам делать):

blobContainer.ListBlobs().OfType<CloudBlob>()
         .Where(b=>b.Properties.ContentType.StartsWith("image"));

Получите .jpg файлы и закажите их по размеру файла, предполагая, что вы задаете имена файлов с их расширениями:

blobContainer.ListBlobs().OfType<CloudBlob>()
    .Where(b=>b.Name.EndsWith(".jpg")).OrderByDescending(b=>b.Properties.Length);

Наконец, запрос не будет выполнен, пока вы не сообщите ему:

var blobs = blobContainer.ListBlobs().OfType<CloudBlob>()
                          .Where(b=>b.Properties.ContentType.StartsWith("image"));

foreach(var b in blobs) //This line will call the service, 
                        //execute the query against it and 
                        //return the desired files
{
   // do something with each file. Variable b is of type CloudBlob
}

Ответ 3

Для возврата определенных результатов один из возможных вариантов - использовать префикс blob и/или контейнера для эффективного индексации того, что вы храните. Например, вы можете префикс даты и времени, когда вы добавляете капли, или вы можете префикс пользователя, зависит от вашего варианта использования относительно того, как вы хотите "индексировать" свои капли. Затем вы можете использовать этот префикс или его часть в вызове ListBlobs [Segmented], чтобы возвращать определенные результаты, очевидно, вам нужно будет сначала поместить наиболее общие элементы, а затем более конкретные элементы, например:

2016_03_15_10_15_blobname

Это позволит вам получить все капли 2016, или март 2016 капли и т.д., но не матовые капли в любой год без нескольких вызовов.

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

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

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

Вы также можете комбинировать эти два подхода, например. фильтрация по вашему "индексу", а затем поиск по результатам.