如何从Azure Blob存储下载文件到浏览器

c# asp.net-mvc azure azure-storage azure-storage-blobs

24562 观看

3回复

4522 作者的声誉

我已经成功列出了可用文件,但我需要知道如何将该文件传递给浏览器以供用户下载而无需将其保存到服务器

以下是我获取文件列表的方法

var azureConnectionString = CloudConfigurationManager.GetSetting("AzureBackupStorageConnectString");
var containerName = ConfigurationManager.AppSettings["FmAzureBackupStorageContainer"];
if (azureConnectionString == null || containerName == null)
    return null;

CloudStorageAccount backupStorageAccount = CloudStorageAccount.Parse(azureConnectionString);
var backupBlobClient = backupStorageAccount.CreateCloudBlobClient();
var container = backupBlobClient.GetContainerReference(containerName); 
var blobs = container.ListBlobs(useFlatBlobListing: true);
var downloads = blobs.Select(blob => blob.Uri.Segments.Last()).ToList();
作者: stackoverfloweth 的来源 发布者: 2015 年 5 月 26 日

回应 (3)


9

4522 作者的声誉

用户单击文件后,服​​务器将对此进行响应

var blob = container.GetBlobReferenceFromServer(option);

var memStream = new MemoryStream();
blob.DownloadToStream(memStream);

Response.ContentType = blob.Properties.ContentType;
Response.AddHeader("Content-Disposition", "Attachment;filename=" + option);
Response.AddHeader("Content-Length", blob.Properties.Length.ToString());
Response.BinaryWrite(memStream.ToArray());

非常感谢Dhananjay Kumar的解决方案

作者: stackoverfloweth 发布者: 26.05.2015 07:15

46

58446 作者的声誉

决定

虽然blob内容可以通过Web服务器流式传输,并通过浏览器传输给最终用户,但此解决方案会将负载放在Web服务器上,包括cpu和NIC。

另一种方法是向最终用户提供要下载的所需blob的uri,他们可以在html内容中单击该ub。例如https://myaccount.blob.core.windows.net/mycontainer/myblob.ext

这个问题是如果内容是私有的,因为除非使用公共blob,否则上面的uri将无法工作。为此,您可以创建共享访问签名(或服务器存储的策略),然后生成附加到uri的散列查询字符串。这个新的uri将在给定的时间长度内有效(例如10分钟)。

这是为blob创建SAS的一个小例子:

var sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5);
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10);
sasConstraints.Permissions = SharedAccessBlobPermissions.Read;

var sasBlobToken = blob.GetSharedAccessSignature(sasConstraints);

return blob.Uri + sasBlobToken;

请注意,开始时间设置为过去的几分钟。这是为了处理时钟漂移。这是我从中获取/修改此代码示例的完整教程

通过使用直接blob访问,您将完全绕过VM / Web角色实例/网站实例(减少服务器负载),并让最终用户直接从blob存储中提取blob内容。您仍然可以使用您的Web应用程序来处理权限,决定要传递的内容等。但是......这使您可以直接链接到blob资源,而不是通过Web服务器传输它们。

作者: David Makogon 发布者: 26.05.2015 08:22

2

4328 作者的声誉

如果您使用ASP.NET(核心),您可以将内容流式传输到浏览器而无需将文件保存在服务器上并使用FileStreamResult,这是IActionResult会更优雅的解决方案。

var stream = await blob.OpenReadAsync();
return File(stream, blob.Properties.ContentType, option);
作者: Andy 发布者: 20.12.2018 04:36
32x32