使用 SAS 将文件从 Azure Blob 存储下载到浏览器

Posted

技术标签:

【中文标题】使用 SAS 将文件从 Azure Blob 存储下载到浏览器【英文标题】:Downloading file to browser from Azure Blob Storage using SAS 【发布时间】:2021-04-29 21:07:54 【问题描述】:

在我的DownloadFile 页面的Page_Load 方法中,从查询字符串中检索用户希望下载的文件名。该文件托管在 Azure Blob 存储帐户中。我正在尝试通过这种方法使用共享访问签名 (SAS) 下载文件:

var containerName = "containerName";
var con = "connectionString";
CloudStorageAccount account = CloudStorageAccount.Parse(con);

var blobClient = account.CreateCloudBlobClient();
var container = blobClient.GetContainerReference(containerName);
var blob = container.GetBlockBlobReference("file.pdf");
var sasToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()

    Permissions = SharedAccessBlobPermissions.Read,
    SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10),
, new SharedAccessBlobHeaders()

    ContentDisposition = "attachment; filename=file.pdf"
);

var blobUrl = string.Format("01", blob.Uri.AbsoluteUri, sasToken);
Response.Redirect(blobUrl);

但是,这不会下载文件。相反,浏览器只会显示文件的乱码:

blobUrl 似乎是有效的。但是Response.Redirect 没有按预期工作。我做错了吗?

注意:我使用的是 WebForms(很遗憾),不是 MVC

【问题讨论】:

这能回答你的问题吗? Downloading Azure Blob files in MVC3 是否需要将 ContentType 属性设置为 application/pdf @Glenn 我不这么认为,因为 URL 指向实际文件,该文件托管在 Azure 中。响应不包含文件。我确实尝试过,但没有任何运气。 @404 不幸的是,没有区别。此外,文件本身不包含在响应中。它没有首先下载到服务器。 Intead,使用 Azure 存储 SAS 令牌生成 URL,Response.Redirect 将重定向到生成的 URL。 【参考方案1】:

我能够通过使用iframe 找到解决方法。如果我在页面中添加iframe

<iframe id="iframeFile" runat="server" style="display:none;"></iframe>

然后在codefile中设置源码:

iframeFile.Src = blobUrl;

它会下载文件。

这可能并不理想,我仍然不确定为什么Response.Redirect 没有按预期工作。所以我当然也愿意接受其他建议。但是这个变通办法确实解决了无法下载文件的问题。

【讨论】:

以上是关于使用 SAS 将文件从 Azure Blob 存储下载到浏览器的主要内容,如果未能解决你的问题,请参考以下文章

使用永久 SAS 为从 blob 存储到 Azure 数据库的 BULK INSERT 创建范围凭据

使用 AspNet 从 Azure Blob 存储下载和重命名文件

使用PowerShell创建Azure Storage的SAS Token访问Azure Blob文件

使用 Blob 特定的 SAS 令牌连接和更新 Azure Blob

从 Azure Blob 存储文件名下载文件时出现的问题包含哈希 (#)

有没有办法重新生成 Azure Blob 存储 SAS 令牌