使用 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