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

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

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

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(); 

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

另一种方法是为最终用户提供要下载的所需blob的uri,他们可以点击html内容。 例如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服务器传输它们。

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

 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的解决方案