【问题标题】:Azure SAS download blobAzure SAS 下载 blob
【发布时间】:2014-05-23 10:34:15
【问题描述】:

我正在尝试使用 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. 如何保护这两个功能,使人们无法在视图之外访问它们?它们现在都是静态函数。我猜这不安全?

【问题讨论】:

    标签: c# azure


    【解决方案1】:

    1,在您看来,您的file 的价值是多少。我不认为 MVC 可以根据您提供的文件创建 CloudBlockBlob 对象。所以这可能是你得到nullCloudBlockBlob 的原因。

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 我修复了 null 问题,但我不太了解 downloadtostream 的工作原理。我添加了:blob.DownloadToStream(Response.Stream);但它在响应下是红色的:非静态字段、方法或属性 System.web.mvc.controller.response.get 需要对象引用当前没有该代码行,它会将 sasuri 作为新页面打开并且其空白。我希望在不更改页面的情况下下载文件。当它实际工作时它会如何工作哈哈?
    • 要在不更改页面的情况下下载 blob,只需在创建 SAS 令牌时添加 content-disposition 标头(请参阅我在您的其他问题中发布的代码示例)并在您的 @ 中执行 RedirectToAction(sasUrl) 987654331@ 方法。不需要DownloadFileTest 方法。 HTH。
    • 嘿,谢谢。你可以在这里看到我的“最终”代码:stackoverflow.com/questions/23825246/…如果它太可怕了请评论哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2021-11-13
    • 2017-04-08
    • 2019-09-11
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多