Powershell Azure存储API:下载整个文件夹/前缀/目录
我需要能够仅使用Azure storage REST API从blob存储帐户下载包含其内容的文件夹 我创建了一个函数(Powershell Azure存储API:下载整个文件夹/前缀/目录,powershell,azure,azure-storage,Powershell,Azure,Azure Storage,我需要能够仅使用Azure storage REST API从blob存储帐户下载包含其内容的文件夹 我创建了一个函数(New-StorageAccountAthorisationHeader),该函数创建了(身份验证)头,我可以下载单个文件,但我找不到有关如何下载整个文件夹的任何参考 如果我将文件夹作为$blob参数传递,则会得到BlobNotFound错误 所述文件夹的URL为:。“somefolder”的内容如下所示: Folder1 FolderA FileA.txt
New-StorageAccountAthorisationHeader
),该函数创建了(身份验证)头,我可以下载单个文件,但我找不到有关如何下载整个文件夹的任何参考
如果我将文件夹作为$blob
参数传递,则会得到BlobNotFound
错误
所述文件夹的URL为:。“somefolder”的内容如下所示:
Folder1
FolderA
FileA.txt
FolderB
FileB.txt
FileC.txt
新的StorageAccountAthorisationHeader:
function New-StorageAccountAuthorizationHeader
{
[cmdletbinding()]
param
(
[string]$StorageAccountName,
[string]$Container,
[string]$Blob,
[string]$accesskey ,
[string]$ResourceUri,
[string]$xmsversion = "2017-04-17"
)
$xmsdate = Get-Date
$xmsdate = $xmsdate.ToUniversalTime()
$xmsdate = $xmsdate.toString('r')
function GetRestApiParameters
{
[cmdletbinding()]
param
(
[Parameter(Mandatory=$true)]
[string]$Uri
)
if($Uri.Contains("?"))
{
Write-Verbose "URI to extract REST parameters: $uri"
return ($Uri.Split("?")[1]).Split("&")
}
}
Write-Verbose "Generating string for signature encryption..."
$partUrl = "/$StorageAccountName/"
if($Container)
{
$partUrl = $partUrl + "$Container/"
}
if($Blob)
{
$parturl = $partUrl + "$Blob"
}
######Don't change the line count or indentation of the here-string#####
$hereString = @"
GET
x-ms-date:$xmsdate
x-ms-version:$xmsversion
$partUrl
"@
$hereString =$hereString -replace "$([char]13)$([char]10)","$([char]10)" #Change `r`n to just `n
$empty = $oSignature = New-Object System.Text.StringBuilder
$empty = $oSignature.Append($hereString)
Write-Verbose "Appending parameters from URI into authorisation string..."
$restParameters = GetRestApiParameters -Uri $ResourceUri -Verbose
if ($restParameters -ne $null)
{
foreach ($param in $restParameters)
{
$empty = $oSignature.Append("$([char]10)$($param.Replace('=',':'))")
}
}
#$oSignature.toString()
Write-Verbose "Encrypting string..."
$hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha.key = [Convert]::FromBase64String($accesskey)
$signature = $hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($oSignature.ToString()))
$signature = [Convert]::ToBase64String($signature)
Write-Verbose "Building header..."
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("x-ms-version", $xmsversion)
$headers.Add("x-ms-date", $xmsdate)
$headers.Add("Authorization", "SharedKey " + $StorageAccountName + ":" + $signature)
#$headers.Add("x-ms-blob-type","BlockBlob")
#$headers.Add("Content-Type", "application\xml")
Write-Verbose ("Header: $($headers | Out-String)")
Return $headers
}
我称之为:
$StorageAccountName = "mystorageaccount"
$container = "acontainer"
$blob = "somefile.txt"
$uriToDownloadBlobs = "https://" + $StorageAccountName + ".blob.core.windows.net/$container/$blob"
$header = $null
$header = New-StorageAccountAuthorizationHeader -StorageAccountName $StorageAccountName -ResourceUri $uriToDownloadBlobs -Verbose -Container $container -Blob $blob
$result = Invoke-WebRequest -Headers $header -Uri $uriToDownloadBlobs -OutFile C:\Temp\$blob -PassThru
$result
所以这是可行的,但正如我所说的,我需要任何提示来帮助下载整个文件夹。看起来这是不可能的?尽管我很想看看Azure存储资源管理器是如何实现的
我的解决方案是压缩文件,然后使用上面的方法下载单个压缩文件。在两端都有几行额外的代码要压缩和提取,但这是当时最快的方法,并且可以很好地用于VSTS任务。看起来这是不可能的?尽管我很想看看Azure存储资源管理器是如何实现的 我的解决方案是压缩文件,然后使用上面的方法下载单个压缩文件。两端都有几行额外的代码要压缩和提取,但这是当时最快的方法,并且可以很好地用于VSTS任务