使用SAS从Azure Blob Storage下载文件到浏览器

3
在我的 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("{0}{1}", blob.Uri.AbsoluteUri, sasToken);
Response.Redirect(blobUrl);

然而,这并没有下载文件。相反,浏览器只是显示了一个乱码字符流的文件: Garbled Characters blobUrl 似乎是有效的。但是,Response.Redirect 没有按预期工作。我做错了什么吗?
注意:我正在使用 WebForms(不幸的是),而不是 MVC。

这个回答解决了你的问题吗?在MVC3中下载Azure Blob文件 - jazb
将ContentType属性设置为application/pdf是必需的吗? - Glenn
1
@Glenn 我不这么认为,因为URL指向的是实际文件,该文件托管在Azure上。响应中不包含文件。我尝试过了,但没有成功。 - JoshG
@404 不幸的是,没有什么区别。响应中也没有包含文件本身。它不会先下载到服务器。相反,使用 Azure 存储 SAS 令牌生成 URL,并且 Response.Redirect 用来重定向到生成的 URL。 - JoshG
1个回答

0

我通过使用一个iframe找到了一种解决方法。 如果将一个iframe添加到页面中:

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

然后在代码文件中设置源:

iframeFile.Src = blobUrl;

它会下载文件。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接