2017-07-19 81 views
0

我需要能夠使用Azure存儲REST API從blob存儲帳戶下載文件夾及其內容。Azure存儲API:下載整個文件夾/前綴/目錄

我創建了一個函數(New-StorageAccountAthorisationHeader),該函數創建可以下載單個文件的(身份驗證)標頭,但我無法找到任何有關如何下載整個文件夾的參考。

如果我將該文件夾作爲$blob參數傳遞,我會得到一個BlobNotFound錯誤。

該文件夾的URL是:https://mystorageaccount.blob.core.windows.net/acontainer/somefolder。 「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 

所以這個工作,但正如我所說,我在任何提示後幫助下載整個文件夾。

回答

0

看起來這是不可能的?儘管我有興趣瞭解Azure存儲瀏覽器如何實現它。

我的解決方案是壓縮文件,然後使用上面的下載單個ZIP文件。在任何一端壓縮和提取一些額外的代碼行,但這是當時最快的方式,它適用於VSTS任務。

相關問題