Прочтите содержимое большого двоичного объекта на Azure Хранилище - PullRequest
0 голосов
/ 27 мая 2020

Я использую пакет Nuget Microsoft. Azure .Storage.Blob, пытаясь получить список больших двоичных объектов в контейнере, а затем читая содержимое.

С помощью метода ListBlobs () я вижу все капли. У каждого элемента большого двоичного объекта есть URI, но я не вижу имени большого двоичного объекта, которое мне нужно для GetBlobReferenceFromServer ().

По этой причине имя большого двоичного объекта является константой в следующем примере кода.

Что такое правильный путь? Должен ли я разделять и анализировать URI, чтобы найти имя большого двоичного объекта? Надо ли использовать другой метод?

Microsoft.Azure.Storage.Blob.CloudBlobContainer container = 
    new Microsoft.Azure.Storage.Blob.CloudBlobContainer(new Uri("https://myaccount.blob.core.windows.net/containername"), 
                                                        new Microsoft.Azure.Storage.Auth.StorageCredentials("myaccount", "**********=="));

IEnumerable<Microsoft.Azure.Storage.Blob.IListBlobItem> blobs = container.ListBlobs();

foreach (var blobItem in blobs)
{
    //string blobUri = blobItem.Uri.ToString();

    Microsoft.Azure.Storage.Blob.ICloudBlob blockBlob = container.GetBlobReferenceFromServer("blobname");
    MemoryStream downloadStream = new MemoryStream();
    blockBlob.DownloadToStream(downloadStream);

    string blobContent = Encoding.UTF8.GetString(downloadStream.ToArray());
}

1 Ответ

1 голос
/ 28 мая 2020

С помощью метода ListBlobs () я вижу все капли. Каждый элемент большого двоичного объекта имеет URI, но я не вижу имени большого двоичного объекта, которое мне нужно для GetBlobReferenceFromServer ().

Причина в том, что метод ListBlobs возвращает перечислимый типа IListBlobItem, у которого нет свойства name. Чтобы получить имя большого двоичного объекта, вы можете привести его к CloudBlob или CloudBlockBlob, которые реализуют этот интерфейс, и вы сможете получить имя blob, который вы можете использовать GetBlobReferenceFromServer метод.

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

Таким образом, ваш код может быть просто:

foreach (var blobItem in blobs)
{
    var blockBlob = (CloudBlockBlob) blobItem;
    MemoryStream downloadStream = new MemoryStream();
    blockBlob.DownloadToStream(downloadStream);

    string blobContent = Encoding.UTF8.GetString(downloadStream.ToArray());
}

Или, если вы не используете go down casting route, вы можете просто создать экземпляр CloudBlockBlob, используя URI, который вы попал как часть листинга.

Примерно так:

foreach (var blobItem in blobs)
{
    var blockBlob = new CloudBlockBlob(blobItem.Uri, container.ServiceClient);
    MemoryStream downloadStream = new MemoryStream();
    blockBlob.DownloadToStream(downloadStream);

    string blobContent = Encoding.UTF8.GetString(downloadStream.ToArray());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...