我已经成功列出了可用文件,但我需要知道如何将该文件传递到浏览器以供用户下载,而不必将其保存到服务器
这是我获取文件列表的方法
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/