我正在使用以下代码,使用户可以通过共享访问签名(SAS)访问我的Blob存储中的单个文件:
var container = _blobClient.GetContainerReference(containerPath[0]);
var blob = container.GetBlockBlobReference(blobName);
var policy = new SharedAccessBlobPolicy()
{
SharedAccessStartTime = DateTimeOffset.UtcNow,
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24),
Permissions = SharedAccessBlobPermissions.Read
};
var blobHeaders = new SharedAccessBlobHeaders();
var sasToken = blob.GetSharedAccessSignature(policy, blobHeaders);
return blob.Uri.AbsoluteUri + sasToken;
我正在创建的令牌已创建,但是它不起作用,出现以下错误:
签名不匹配。用于签名的字符串是r 2019-06-07T09:19:05Z 2019-06-08T09:19:05Z /blob/X/filestore/images/company/X.jpeg 2018-11-09 b
其中filestore/images/company/
是目录,X.jpeg
是我的文件名。
我的Blob容器是私有的。
我已经尝试过针对类似主题的问题提供的大多数选项,但不确定我要去哪里。我通过Azure门户为此Blob创建了一个共享访问签名,它工作得很好。有什么想法吗?
答案 0 :(得分:0)
此后,我通过尝试使容器对象位于属性上方,发现在Azure存储中找不到我的容器和文件。这很奇怪,因为文件路径正确。 浏览时,我发现了这个answer:
实际上只有一层容器。您实际上可以创建类似于分层存储的“文件系统”,但实际上,所有内容都将在1层(即其中的容器)中。
对于创建虚拟的“文件系统”(例如存储),您可以使用blob 包含“ /”的名称,以便您可以使用 您的存储方式。另外,很棒的是,您可以搜索斑点 在虚拟级别上,通过给出不完整的字符串(最多为'/')。
这意味着对于我的blob(filestore/images/company/x.jpg
),容器只是filestore
,blob名称为images/company/x.jpg
,即使Azure Portal显示了子文件夹,实际结构也是平坦的
一旦我学会了这一点,便能够以完全相同的方式创建我的共享访问签名,但这一次它起作用了。