【问题标题】:How can I get an Azure CloudBlockBlob from a storage URL with a SAS?如何从具有 SAS 的存储 URL 获取 Azure CloudBlockBlob?
【发布时间】:2013-01-08 18:44:21
【问题描述】:

我正在尝试重构我们的 MVC 代码,该代码有很多页面使用下载 url,这些 url 指向带有 SAS 的 blob。如果能够将 Url 传递给控制器​​并使用它来定位关联的 Blob,那就太好了。例如。有一个将下载 URL 作为其唯一输入参数的操作。我还可以创建一个链接助手,仅在 SAS 公开删除等时显示删除链接。

如果我可以将 Url 传递给 Azure 并获得 CloudBlockBlob 作为回报,那将是一个很大的帮助。所以我可以删除它、更新它、获取元数据等。

我目前唯一能做到的方法就是使用类似的技术

     var deleteBlobRequest = BlobRequest.Delete(new Uri(fileUrl), 30, null, DeleteSnapshotsOption.IncludeSnapshots, "");
     deleteBlobRequest.GetResponse().Close();

这可行,但看起来很奇怪。

我无法弄清楚从 Uri 获取 CloudBlockBlob 的代码。

有什么想法吗?我目前使用的是 Azure Storage 1.7

【问题讨论】:

    标签: azure azure-storage azure-blob-storage


    【解决方案1】:

    这里是获取 SAS 密钥权限的代码(假设 blobUrl 是带有 SAS 密钥的 url):

    // Get permssions for current SAS key.
    var queryString = HttpUtility.ParseQueryString(blobUrl);
    var permissionsText = queryString["sp"];
    var permissions = SharedAccessBlobPermissions.None;
    if (permissionsText.Contains("w"))
        permissions = permissions | SharedAccessBlobPermissions.Write;
    if (permissionsText.Contains("r"))
        permissions = permissions | SharedAccessBlobPermissions.Read;
    if (permissionsText.Contains("d"))
        permissions = permissions | SharedAccessBlobPermissions.Delete;
    if (permissionsText.Contains("l"))
        permissions = permissions | SharedAccessBlobPermissions.List;
    

    这将获得一个基于 URL with SAS 密钥的 ICloudBlob(假设 blobUrl 是一个带有 SAS 密钥的 url):

    // Get the blob reference.
    var blobUri = new Uri(blobUrl);
    var path = String.Format("{0}{1}{2}{3}", blobUri.Scheme, Uri.SchemeDelimiter, blobUri.Authority, blobUri.AbsolutePath);
    var blobClient = new CloudBlobClient(new Uri(path), new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(blobUri.Query));
    ICloudBlob blobReference = blobClient.GetBlobReferenceFromServer(new Uri(path));
    

    【讨论】:

    • 那是用v2存储客户端吗?
    • 是的,但要获取权限列表,我只需解析不需要您使用 SDK 的查询字符串。
    • 感谢权限位。我正在努力获取这个文件。只是我似乎无法创建 ICloudBlob 或找到 GetBlobReferenceFromServer。我认为这是因为我使用的是 1.7 for Storage。
    【解决方案2】:

    您不必做任何特别的事情。如果您使用 SAS Uri 构建 blob,则存储客户端库会为您处理此问题。比如下面这段代码:

            CloudBlockBlob cloudBlockBlob = new CloudBlockBlob("http://127.0.0.1:10000/devstoreaccount1/temp/sastest.txt?sr=b&st=2013-01-25T04%3A28%3A09Z&se=2013-01-25T05%3A28%3A09Z&sp=rwd&sig=jIWWFwZ6MXaL6FD%2F2%2FpqPl1g4f0ElFrr1fKNg5U%2FAkg%3D");
            cloudBlockBlob.Delete();
    

    这样就可以了。

    【讨论】:

    • 效果很好。奇怪我以为我试过了。也许是在我正确获得包括删除权限的签名之前。
    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多