如何从具有SAS的存储URL获取Azure CloudBlockBlob?

时间:2013-01-24 21:21:35

标签: azure azure-storage azure-storage-blobs

我正在尝试重构我们的MVC代码,它有很多页面使用下载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

2 个答案:

答案 0 :(得分:4)

你不需要做任何特别的事情。如果使用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();

这样可以正常工作。

答案 1 :(得分: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 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));