Хранилище BLOB-объектов Azure - 404 при сохранении в файл - PullRequest
0 голосов
/ 14 мая 2019

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

using System.IO;
using System.Linq;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

namespace BlobStorage
{
    class Program
    {
        static void Main(string[] args)
        {
            CloudStorageAccount backupStorageAccount = CloudStorageAccount.Parse(
                "{connectionString}");

            var backupBlobClient = backupStorageAccount.CreateCloudBlobClient();
            var backupContainer = backupBlobClient.GetContainerReference("{container-name");

            var list = backupContainer.ListBlobs(useFlatBlobListing: true);

            foreach (var blob in list)
            {
                var blobFileName = blob.Uri.Segments.Last();
                CloudBlockBlob blockBlob = backupContainer.GetBlockBlobReference(blobFileName);

                string destinationPath = string.Format(@"D:\" + blobFileName +".txt");

                blockBlob.DownloadToFile(destinationPath, FileMode.OpenOrCreate);
            }
        }
    }
}

Сообщение об ошибке:

Microsoft.WindowsAzure.Storage.StorageException: «Удаленный сервер возвратил ошибку: (404) не найден. "

Внутреннее исключение WebException: удаленный сервер возвратил ошибку: (404) Не найдено.

И указывает на линию:

blockBlob.DownloadToFile (destinationPath, FileMode.OpenOrCreate);

Подобный файл больше всего существует в хранилище BLOB-объектов. Когда я захожу в редакции BLOB-объектов, копирую URL-адрес в файл, я могу без проблем загрузить его через браузер. К сожалению, я не могу загрузить его с уровня приложения из-за ошибки 404.

Только почему такой файл существует?

1 Ответ

1 голос
/ 14 мая 2019

Проблема в том, как вы получаете имя BLOB-объекта в следующей строке кода:

var blobFileName = blob.Uri.Segments.Last();

Учитывая, что путь равен tempdata/ExampleIotHub/02/2019/05/14/39, имя BLOB-объекта ExampleIotHub/02/2019/05/14/39 (предполагается, что ваш контейнерзовут tempdata), однако значение blobFileName, которое вы получаете, составляет всего 39 (см. примеры here).Поскольку блоб с именем 39 отсутствует, вы получаете эту ошибку 404.

Я предлагаю вам попробовать сделать что-то вроде следующего:

foreach (var blob in list)
{
    var localFileName = blob.Uri.Segments.Last();
    CloudBlockBlob blockBlob = blob as CloudBlockBlob;
    if (blockBlob != null)
    {
      string destinationPath = string.Format(@"D:\" + localFileName +".txt");

      blockBlob.DownloadToFile(destinationPath, FileMode.OpenOrCreate);
    }
}

Обратите внимание, что яне пытался запустить этот код, поэтому могут быть некоторые ошибки.

...