Как загрузить большие двоичные объекты Azure, указав файл?

Я хочу загружать файлы из Azure с помощью C #, а затем передавать их в MemoryStream после этого возврата / отображения пользователю во внешнем интерфейсе со ссылкой (Azure URI, который переходит в большой двоичный объект Azure), и пользователь сможет увидеть эти PDF-файлы. файлы в браузере или загрузите их. В Azure есть несколько больших двоичных объектов / файлов, поэтому я хочу перебрать каждый файл и загрузить его в поток, например: с помощью foreach.

Я не уверен, как я могу ссылаться на эти капли CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);, поскольку здесь я мог бы указать имя конкретного файла, но у меня несколько файлов, поэтому я не уверен, что делать здесь «fileName».

Код:

var files = container.ListBlobs();

foreach (var file in files)
{
   using (var memoryStream = new MemoryStream())
   {
      CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
      blockBlob.DownloadToStream(memoryStream);
   }
}

Я не уверен, исправляю ли я цикл исправления прямо сейчас в коде и загружаю каждый blob?

Кроме того, я попытался заменить fileName на file.Uri.Segments.Last() - я думаю, что получает имя blobs.

Проблема, с которой я столкнулся, заключается в том, что этот foreach просто дает мне один файл PDF всякий раз, когда я пытаюсь использовать ссылки во внешнем интерфейсе. Итак, мне нужно знать, как я могу правильно просмотреть каждый файл и загрузить их?


person Pathankotia    schedule 20.11.2017    source источник
comment
@ScottChamberlain - На самом деле, после того, как это сработало, я подумал использовать SAS, чтобы пользователь мог использовать эти ссылки только в течение короткого периода времени, поскольку у контейнера есть доступ только для чтения, однако, если у вас есть другой способ, который был бы лучше, позвольте мне знать.   -  person Pathankotia    schedule 21.11.2017
comment
У меня есть метод, с помощью которого я возвращаю byte [] каждого большого двоичного объекта пользователю с типом содержимого и именем файла, поэтому сначала я хочу загрузить в поток, затем преобразовать эти файлы в byte [], а затем вернуться.   -  person Pathankotia    schedule 21.11.2017
comment
Вы не сказали нам, что идет не так, когда вы пытаетесь выполнить опубликованный вами код. Вы получаете сообщение об ошибке, неожиданное поведение, что? Пожалуйста, отредактируйте свой вопрос, чтобы добавить подробности.   -  person Scott Chamberlain    schedule 21.11.2017
comment
Проблема, о которой вы говорите, ничего не делает с файлами, кроме как копировать ее в поток памяти, а затем выбросить, откуда вы знаете, что читается только один файл? Вам необходимо создать минимальный, полный и проверяемый пример, демонстрирующий проблему, которую мы могли бы скопировать, вставить и увидеть в наших собственных проектах. .   -  person Scott Chamberlain    schedule 21.11.2017
comment
Вы уверены, что загружаете файл правильно? И это не нулевые байты?   -  person granadaCoder    schedule 21.11.2017
comment
@granadaCoder - Да, я уверен, что проверил azure, и файл, который он загружает, работает, но он просто загружает один файл.   -  person Pathankotia    schedule 21.11.2017
comment
Одна проблема, которую я вижу в вашем коде, заключается в том, что вы просматриваете все файлы в цикле, поэтому поток памяти будет содержать только содержимое последнего файла в цикле.   -  person Gaurav Mantri    schedule 21.11.2017
comment
@GauravMantri - Да, я предполагаю, что это может быть проблемой, так что вы хоть представляете, как я могу загрузить все файлы для потоковой передачи или сохранить все файлы в MemoryStream?   -  person Pathankotia    schedule 21.11.2017


Ответы (1)


Итак, мне нужно знать, как я могу правильно просмотреть каждый файл и загрузить их?

Мы не можем напрямую загрузить несколько файлов из памяти. Если zip-файл приемлем, вы можете использовать сжатый файл, например zip-файл, для передачи нескольких файлов. Ниже приведен мой демонстрационный код, он корректно работает на моей стороне.

  using (var ms = new MemoryStream())
  {
      using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
      {
           foreach (var file in files)
           {
                if (file.GetType() != typeof(CloudBlockBlob)) continue;
                var blob = (CloudBlockBlob) file;
                var entry = zipArchive.CreateEntry(blob.Name, CompressionLevel.Fastest);
                using (var entryStream = entry.Open())
                {
                    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blob.Name);
                    blockBlob.DownloadToStream(entryStream);

                }
           }
      }
  }
person Tom Sun - MSFT    schedule 21.11.2017