Azure SAS下载blob

时间:2014-05-22 22:31:16

标签: c# azure

我正在尝试下载一个带有SAS的blob,现在还有点无能为力。

我在视图中列出了所有所属的用户blob。当用户点击blob时,它应该开始下载它。

以下是观点:

@foreach (var file in Model)
{
        <a href='@Url.Action("GetSaSForBlob", "Folder", new { blob = file })>
        </a>
}

这是我在“文件夹”控制器中的两个功能。

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);
    }
}
  1. 我应该从我的观点传递给GetSasForBlob?目前,CloudBlockBlob blob为空。

  2. 我是否缺少函数DownloadFileTest中的任何代码?

  3. 我应该直接从GetSasForBlob调用DownloadFileTest吗?

  4. 我如何保护这两个功能,以便人们无法在视图外访问它们?它们现在都是静态函数。我猜这不安全吗?

1 个答案:

答案 0 :(得分:0)

1,您视图中file的值是多少。我不认为MVC可以根据您提供的文件创建CloudBlockBlob对象。因此,这可能是您获得null的{​​{1}}的原因。

2,在你的CloudBlockBlob中,你只需将blob的二进制文件下载到服务器的内存流中即可。如果您需要让用户将其下载到本地磁盘,您需要将二进制文件放入DownloadFileTest。您可以使用类似Response.Stream的内容。

3,这取决于你。如果需要,可以使用相同的方法合并它们。

4,如果您希望用户通过您的Web前端(网站或Web服务)下载blob,就像您现在所做的那样,您需要将Blob容器设置为blob.DownloadToStram(Response.Stream)并保护您的网站或Web服务使用loke private属性。基本上在您的情况下,您根本不需要使用SAS,因为所有下载请求都是通过您的网络前端执行的。

希望这有点帮助。