C# Azure SAS下载blob
我正在尝试下载一个带有SAS的blob,现在有点不知所措 我正在视图中列出所有属于的用户blob。当用户点击blob时,它应该开始下载它 以下是视图:C# Azure SAS下载blob,c#,azure,C#,Azure,我正在尝试下载一个带有SAS的blob,现在有点不知所措 我正在视图中列出所有属于的用户blob。当用户点击blob时,它应该开始下载它 以下是视图: @foreach (var file in Model) { <a href='@Url.Action("GetSaSForBlob", "Folder", new { blob = file })> </a> } 我应该从我的视图传递什么到GetSasForBlob?目前CloudBlo
@foreach (var file in Model)
{
<a href='@Url.Action("GetSaSForBlob", "Folder", new { blob = file })>
</a>
}
1、视图中的
文件的值是多少。我认为MVC无法基于您提供的文件创建CloudBlockBlob
对象。因此,这可能是您获得CloudBlockBlob
的null
的原因
2、在DownloadFileTest
中,只需将blob的二进制文件下载到服务器的内存流中即可。如果需要让用户将其下载到本地磁盘,则需要将二进制文件放入Response.Stream
。您可以使用类似于blob.DownloadToStram(Response.Stream)
的东西
3、那由你决定。如果需要,可以用相同的方法合并它们
4、如果您希望用户通过您的web前端(网站或web服务)下载blob,就像您现在所做的那样,您需要将blob容器设置为私有
,并使用loke[Authorize]
属性来保护您的网站或web服务。基本上,在您的情况下,您根本不需要使用SAS,因为所有下载请求都是通过web前端执行的
希望这能有所帮助。我解决了空问题,但我真的不明白downloadtostream是如何工作的。。我添加了:blob.DownloadToStream(Response.Stream);但在Response下为红色:非静态字段、方法或属性System.web.mvc.controller.Response.get需要一个对象引用。当前,如果没有该代码行,它会将sasuri作为一个新页面打开,并且为空。我希望文件下载时不更改页面。当它实际工作时,它将如何工作哈哈?要下载blob而不更改页面,只需在创建SAS令牌时添加内容处置标题(请参阅我在其他问题中发布的代码示例)并在
GetSaSForBlob
方法中执行重定向到操作(sasrl)。无需下载文件测试方法。嘿,谢谢。你可以在这里看到我的“最终”代码:请评论,如果它是可怕的哈哈
public void GetSaSForBlob(CloudBlockBlob blob)
{
var sas = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5),
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(3),
Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Write,
});
DownloadFileTest(string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas));
//return string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas);
}
static void DownloadFileTest(string blobSasUri)
{
CloudBlockBlob blob = new CloudBlockBlob(new Uri(blobSasUri));
using (MemoryStream ms = new MemoryStream())
{
blob.DownloadToStream(ms);
byte[] data = new byte[ms.Length];
ms.Position = 0;
ms.Read(data, 0, data.Length);
}
}