web-dev-qa-db-ja.com

ファイルとフォルダーをAzureBlobStorageにアップロードします

Azureでストレージアカウントを作成し、コンテナーを作成しました。サーバーに保存されているファイルをアップロードしようとしています。ファイルは800個のフォルダーに保存されています。このPowershellスクリプトでこれを実行しようとしましたが、サブフォルダーでは機能しません。

$LocalFolder = "\\Server\Data" 

Add-AzureAccount 


# Set a default Azure subscription.
Select-AzureSubscription -SubscriptionName 'nameofsubscription' –Default


$Key = Get-AzureStorageKey -StorageAccountName  mydatastorename

$Context = New-AzureStorageContext -StorageAccountKey $Key.Primary -StorageAccountName mydatastorename

foreach ($folder in Get-ChildItem $LocalFolder)
    {

            ls –Recurse –Path $LocalFolder |Set-AzureStorageBlobContent  -Container nameofcontainer -Context $Context -BlobType Block
    }

$ LocalFolderを "\ Server\Data\subfolders001"に設定すると、subfolder001内のファイルがコンテナーにアップロードされます。しかし、「\ Server\Data」として保持すると、機能しません。

スクリプトで、その中のすべてのサブフォルダーとファイルをストレージコンテナーにアップロードする必要があります。

実行したときに得られる出力を追加しました

エラーメッセージは表示されませんが、サブフォルダごとに1つの警告メッセージが表示されます

 WARNING: Can not upload the directory '\\Server\Data\subfolders001' to Azure. If you want to upload directory, please use "ls -File -Recurse | Set-AzureStorageBlobContent -Container containerName".

次に、しばらく待った後、PowerShellスクリプトを停止する必要があることに注意してください。

8

これを自分で解決しただけです。以下の私の解決策を参照してください。

$StorageAccountName = "storageAccountName"
$StorageAccountKey = "StorageAccountKey"
$ContainerName = "ContainerName"
$sourceFileRootDirectory = "AbsolutePathToStartingDirectory" # i.e. D:\Docs

function Upload-FileToAzureStorageContainer {
    [cmdletbinding()]
    param(
        $StorageAccountName,
        $StorageAccountKey,
        $ContainerName,
        $sourceFileRootDirectory,
        $Force
    )

    $ctx = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
    $container = Get-AzureStorageContainer -Name $ContainerName -Context $ctx

    $container.CloudBlobContainer.Uri.AbsoluteUri
    if ($container) {
        $filesToUpload = Get-ChildItem $sourceFileRootDirectory -Recurse -File

        foreach ($x in $filesToUpload) {
            $targetPath = ($x.fullname.Substring($sourceFileRootDirectory.Length + 1)).Replace("\", "/")

            Write-Verbose "Uploading $("\" + $x.fullname.Substring($sourceFileRootDirectory.Length + 1)) to $($container.CloudBlobContainer.Uri.AbsoluteUri + "/" + $targetPath)"
            Set-AzureStorageBlobContent -File $x.fullname -Container $container.Name -Blob $targetPath -Context $ctx -Force:$Force | Out-Null
        }
    }
}

ランニング:

Upload-FileToAzureStorageContainer -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -ContainerName $ContainerName -sourceFileRootDirectory $sourceFileRootDirectory -Verbose

実行時に次の出力が出力されることがわかります。

VERBOSE: Uploading testfile.json to https://storagecontainername.blob.core.windows.net/path/testfile.json
VERBOSE: Performing the operation "Set" on target "/path/testfile.json".
ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
BlobType          : BlockBlob
Length            : 0
ContentType       : application/octet-stream
LastModified      : 23/03/2017 14:20:53 +00:00
SnapshotTime      :
ContinuationToken :
Context           : Microsoft.WindowsAzure.Commands.Common.Storage.AzureStorageContext
Name              : /path/testfile.json

VERBOSE: Transfer Summary
--------------------------------
Total:  1.
Successful: 1.
Failed: 0.

これは完璧ではないことは認めますが、少しの努力で、より複雑なシナリオファイルのアップロードに対応できるように拡張できますが、ディレクトリのコンテンツをターゲットストレージコンテナにアップロードする場合はうまくいくはずです。

Azure Storage Containersは基本的に、他のストレージコンテナーを含めることができないディレクトリです。そのため、Azure Storage Containerにフォルダー構造を実装するには、検索を開始したルートフォルダーまでのパスをファイルの前に付ける必要があります。つまりあなたのルートが:

D:\Files

そしてファイルには以下が含まれます:

Folder 1
  -> File 1.txt
File 2.txt

ターゲットパスを次のように設定する必要があります

$StorageContainerObject.CloudBlobContainer.Uri.AbsoluteUri + "\Files\Folder 1\File 1.txt"
$StorageContainerObject.CloudBlobContainer.Uri.AbsoluteUri + "\Files\File 2.txt"

Azure Storage Explorerなどのツールを使用してストレージコンテナーを表示すると、ファイルがすべて1つのコンテナー内に格納されている場合でも、ファイル構造が認識されます。

ありがとう、

ジェイミー

11
Jamie

Azure Blob Storageには、フォルダーのレベルが1つだけあります-containers

代わりに、以下のいくつかのオプションを使用できます

1
vmoskalenko