如何使用SAS下载Blob

时间:2016-11-23 21:17:30

标签: azure azure-storage-blobs azcopy

我正在尝试使用AzCopy 5.1.0使用Storage Explorer生成的SAS从Blob存储容器中下载单个 blob:

https://myaccount.blob.core.windows.net/mycontainer/[blob-uuid]?st=2016-11-23T18%3A26%3A00Z&se=2016-11-24T18%3A26%3A00Z&sp=rl&sv=2015-12-11&sr=b&sig=[signature]

azcopy /Source:https://myaccount.blob.core.windows.net/mycontainer /SourceSAS:"?st=2016-11-23T18%3A26%3A00Z&se=2016-11-24T18%3A26%3A00Z&sp=rl&sv=2015-12-11&sr=b&sig=[signature]" /Dest:"c:\data"

如果/ Source应该是blob容器,并且/ SourceSAS应该是SAS 令牌,那么我需要传递实际的Blob键([blob-uuid] )。

恕我直言,这应该是/ SourceKey,但是指定我的blob键会返回错误:“提供的存储密钥(SourceKey)不是有效的Base64字符串。”这与将参数描述为“存储帐户密钥”的命令行帮助一致。

我能找到的唯一其他候选者是/ Pattern,但这似乎更多是通过枚举容器的内容来下载blob的情况。这似乎与我在这里指定精确的blob键时得到的403错误一致;容器是私人的。

在任何情况下,AzCopy都会抱怨“服务器无法验证请求。请确保正确形成Authorization标头的值,包括签名。”根据我的经验,这表明生成SAS签名的原始URI未正确重建。

我可以直接通过curl使用原始SAS URI,因此这不是签名不一致的问题。

我还尝试使用SDK以编程方式生成SAS URI,因此我可以指定共享访问策略,但这也不起作用。我仍然认为AzCopy需要缺少SAS URI。

3 个答案:

答案 0 :(得分:0)

阅读docs

  

下载单个blob:

AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer /Dest:C:\myfolder /SourceKey:key /Pattern:"abc.txt"

/Source将是您的容器

之前的URI

/SourceKey将是您的关键,但在开头没有问号

/Pattern将是您的blob的名称

/Destination将是您希望下载blob的本地文件夹名称

答案 1 :(得分:0)

我们可以使用帐户密钥容器SAS令牌从容器来源下载blob。并且不支持blob URI作为下载blob的源。下面的快照是我的测试结果。

1.使用容器作为源和容器SAS令牌。使用模式选择下载blob。

AzCopy /Source:https://mystorageAccount.blob.core.windows.net/mycontainer /Dest:C:\myfolder /SourceSAS:"?st=2016-11-24T02%3A34%3A00Z&se=2016-11-25T02%3A34%3A00Z&sp=rl&sv=2015-12-11&sr=c&sig=[s‌​ignature]" /Pattern:blobName

enter image description here

2.使用容器作为源和帐户密钥令牌。它也可以工作。如果我使用了错误的密钥令牌(connectionstring),那么我会得到"The supplied storage key (SourceKey) is not a valid Base64 string"错误

enter image description here

3.使用容器作为源和blob SAS令牌,它不起作用

enter image description here

4.使用blob作为源和容器SAS令牌,它不支持没有模式

enter image description here

[更新]

我们可以使用azure storage .Net SDK使用blob SAS Token从blob uri下载blob。

StorageCredentials storageCredentials = new StorageCredentials("blob sas token");//without "?"
            var blobName = "blobName";
            var downloadFolder = @"c:\filefolder";
            var filePath = Path.Combine(downloadFolder, blobName);
            CloudBlockBlob sourceBlockBlob = new CloudBlockBlob(new Uri("blob url"), storageCredentials);
            sourceBlockBlob.DownloadToFile(filePath, FileMode.Create);

答案 2 :(得分:0)

AzCopy传输目标始终是一个目录,而不是单个blob /文件,因此AzCopy需要容器级SAS而不是blob SAS。 该模式仅用于过滤掉要传输的对象。

我们将打开一个任务来跟踪使用blob SAS下载单个blob。无论如何,这与当前的AzCopy逻辑不一致,我们将其作为新的功能请求。