Извлечение встроенных файлов из лазурного BLOB-объекта в С#

У меня есть встроенные файлы PDF, хранящиеся внутри файла BLOB-объектов. Я хочу извлечь эти файлы из своего BLOB-объекта.

ниже то, что я сделал до сих пор:

  1. Я сделал приложение с функцией триггера http
  2. установить соединение с контейнером для хранения
  3. в состоянии получить blob.

получить встроенный файл, я использую следующий код:

namespace PDFDownloader {
  public static class Function1 { [FunctionName("Function1")]
    public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) {
      log.LogInformation($"GetVolumeData function executed at: 
       {DateTime.Now}");
      try {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Parameter.ConnectionString);
        CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer cloudcontainer = cloudBlobClient.GetContainerReference(Parameter.SuccessContainer);

        BlobResultSegment resultSegment = await
        cloudcontainer.ListBlobsSegmentedAsync(currentToken: null);
        IEnumerable <IListBlobItem> blobItems = resultSegment.Results;

        string response = "";
        int count = 0;
        //string blobName = "";

        foreach(IListBlobItem item in blobItems) {
          var type = item.GetType();
          if (type == typeof(CloudBlockBlob)) {
            CloudBlockBlob blob = (CloudBlockBlob) item;
            count++;
            var blobname = blob.Name;
            // response = blobname;
            response = blob.DownloadTextAsync().Result;
            //response = blob.DownloadToStream().Result;
          }
        }

        if (count == 0) {
          return new OkObjectResult("Error : File Not Found !!");
        } else {
          return new OkObjectResult(Convert.ToString(response));
        }
      } catch(Exception ex) {
        log.LogError($ " Function Exception Message: {ex.Message}");
        return new OkObjectResult(ex.Message.ToString());
      } finally {
        log.LogInformation($"Function- ENDED ON : {DateTime.Now}");
      }
    }
  }

как я могу прочитать встроенные файлы из моего ответа файла BLOB-объектов и отправить его на http?


person shinu    schedule 23.11.2020    source источник
comment
пожалуйста, включите весь код вашей функции, включая заголовок (параметры и т. д.)   -  person silent    schedule 23.11.2020
comment
@silent Я обновил весь код. пожалуйста, проверьте, можете ли вы помочь мне получить встроенный файл из файла blob   -  person shinu    schedule 23.11.2020


Ответы (2)


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

FileStream inputStream = new FileStream(response, FileMode.Open);

Объект response содержит текстовое содержимое большого двоичного объекта, который вы скачали ранее. Однако ctor Filestream ожидает путь к файлу. Поскольку у вас нет файла здесь, Filestream не подходит для использования. Либо загрузите большой двоичный объект в виде временного файла, либо даже напрямую в виде строки.

Кроме того, сделайте себе одолжение и переключитесь на последнюю версию пакета SDK Storage Blob (https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/storage/Azure.Storage.Blobs#downloading-a-blob).

person silent    schedule 23.11.2020
comment
да, сразу после этой строки мой отладчик переходит к блоку Catch. мой blob находится в формате pdf, и в ответ мне нужно получить содержимое blob (содержимое представляет собой встроенные файлы pdf и xml). Если я не использую Filestream, то как мне приступить к чтению большого двоичного объекта и извлечению из него встроенных файлов ?? Я много искал, но не мог найти никакой альтернативы. и мой другой вопрос: что я должен использовать вместо передачи ответа в файловом потоке? - person shinu; 23.11.2020

Думайте, что один большой двоичный объект эквивалентен одному файлу (проверьте его здесь ).

Проверьте строку:

response =  Convert.ToString(blob.DownloadTextAsync().Result);

Является ли содержимое вашего большого двоичного объекта допустимым путем к файлу?

Возможно, вы неправильно используете конструктор класса FileStream public FileStream (строковый путь, режим System.IO.FileMode). Этот конструктор может генерировать множество различных исключений, попробуйте найти ваш.

Также, как было рекомендовано в предыдущем ответе, стоит использовать пакет Azure.Storage.Blobs на основе SDK версии 12, сейчас вы используете SDK версии 11 (Microsoft.Azure.Storage. Блоб).

person Igor    schedule 23.11.2020
comment
я не могу сохранить большой двоичный объект локально, поэтому какой путь я должен указать в файловом потоке .... Можете ли вы помочь мне с тем, что я должен указать там? Могу ли я без локального сохранения указать путь непосредственно к моему блобу? - person shinu; 23.11.2020