我正在尝试使用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。
答案 0 :(得分:0)
阅读docs:
下载单个blob:
AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer /Dest:C:\myfolder /SourceKey:key /Pattern:"abc.txt"
/Source
将是您的容器
/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=[signature]" /Pattern:blobName
2.使用容器作为源和帐户密钥令牌。它也可以工作。如果我使用了错误的密钥令牌(connectionstring),那么我会得到"The supplied storage key (SourceKey) is not a valid Base64 string"
错误
3.使用容器作为源和blob SAS令牌,它不起作用
4.使用blob作为源和容器SAS令牌,它不支持没有模式
[更新]
我们可以使用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逻辑不一致,我们将其作为新的功能请求。