如何通过引用文件下载 Azure Blob?

Posted

技术标签:

【中文标题】如何通过引用文件下载 Azure Blob?【英文标题】:How to download Azure Blobs by referencing the file? 【发布时间】:2018-05-04 06:10:51 【问题描述】:

我想使用 C# 从 Azure 下载文件,然后将这些文件流式传输到 MemoryStream 中,然后通过链接(Azure URI - 转到 Azure blob)在前端返回/显示给用户,并且用户将能够在浏览器中查看这些 PDF 文件或下载它们。 Azure 中有多个 blob/文件,所以我想遍历每个文件并下载到流,例如:使用 foreach。

我不确定如何引用这些 blob 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?

另外,我尝试用file.Uri.Segments.Last() 替换fileName - 我猜哪个得到了 blob 的名称。

我遇到的问题是,每当我尝试使用前端的链接时,这个 foreach 只会给我一个 PDF 文件。那么,我需要知道如何正确地遍历每个文件并下载它们?

【问题讨论】:

@ScottChamberlain - 实际上,在完成这项工作之后,我正在考虑使用 SAS,以便用户只能在短时间内使用这些链接,因为容器只有读取权限,但是,如果你有一些其他更好的方式让我知道。 我有一个方法,通过它我可以将每个 blob 的字节 [] 返回给具有内容类型和文件名的用户,所以,首先我想下载到流然后转换这些文件进入 byte[] 然后返回。 当您尝试执行您发布的代码时,您还没有告诉我们出了什么问题。您是否收到错误,意外行为,什么?请编辑您的问题以添加详细信息。 您所说的问题除了将文件复制到内存流然后扔掉之外,对文件没有任何作用,您怎么知道只读取一个文件?您需要创建一个 Minimal, Complete, and Verifiable example 来演示我们可以复制和粘贴并在我们自己的项目中看到的问题。 您确定上传文件正确吗?而且它不是零字节? 【参考方案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);

                
           
      
  

【讨论】:

以上是关于如何通过引用文件下载 Azure Blob?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 Azure 文件夹中的 blob 文件 [关闭]

如何通过 Apache Beam 将文件上传到 Azure blob 存储?

有没有办法通过 Javascript 删除 Azure Blob 容器文件?

如何在不编写自己的程序的情况下将某些文件上传到 Azure Blob 存储?

如何在没有文件路径的情况下将文件上传到 Azure Blob 存储容器的根目录

如何在不将文件保存在本地存储上的情况下将对象传输到 Azure Blob 存储?