Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure SAS下载blob_C#_Azure - Fatal编程技术网

C# Azure SAS下载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

我正在尝试下载一个带有SAS的blob,现在有点不知所措

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

以下是视图:

@foreach (var file in Model)
{
        <a href='@Url.Action("GetSaSForBlob", "Folder", new { blob = file })>
        </a>
}
  • 我应该从我的视图传递什么到GetSasForBlob?目前CloudBlockBlob blob为空

  • 函数DownloadFileTest中是否缺少任何代码

  • 我应该直接从GetSasForBlob调用DownloadFileTest吗

  • 如何保护这两个功能,使人们无法在视图之外访问它们?它们现在都是静态函数。我猜那不安全


  • 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);
        }
    }