c# - 如何从 Azure Blob 存储将文件下载到浏览器

标签 c# asp.net-mvc azure azure-storage azure-blob-storage

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

这是我获取文件列表的方法

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 内容中单击该 uri。例如https://myaccount.blob.core.windows.net/mycontainer/myblob.ext

问题在于内容是否是私有(private)的,因为除非使用公共(public) 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;

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

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

关于c# - 如何从 Azure Blob 存储将文件下载到浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30467013/

相关文章:

asp.net-mvc - web.config 中的错误 - MVC

c# - 将 ASPNET MVC RC1 迁移到 RC2 后出现 Entity Framework Core 错误

amazon-web-services - 使用k8s SDK应用yaml文件

azure - 在函数执行过程中动态创建Azure函数中的AppSettings C#

c# - 我可以在 Windows 服务中托管(自托管)WCF 服务并通过 http 公开它吗?

azure - 机器人是远程的,但回调 URL 是 localhost

C# 屏幕检测

c# - 在 JSON web-api 上公开的对象 - 如何阻止属性名称更改大小写?

c# - 从暂停菜单退出以从标题屏幕重新启动 C#

c# - 如何在三元运算符中编写多个语句?