如何通过引用文件下载 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Apache Beam 将文件上传到 Azure blob 存储?
有没有办法通过 Javascript 删除 Azure Blob 容器文件?
如何在不编写自己的程序的情况下将某些文件上传到 Azure Blob 存储?