Azure копирует капли из одной учетной записи хранилища в другую в той же подписке, используя API останова

Я хотел бы скопировать blob из одной учетной записи хранилища в другую учетную запись хранилища в той же подписке, используя Rest API и PHP. Я могу сделать копию blob из одного контейнера в другой в той же учетной записи хранилища, используя приведенный ниже код

<?php $date = gmdate('D, d MYH:i:s \G\M\T'); $account_name = "accname"; $destcontainername = "destcontainer"; $blobname = "blob.png"; $sourcecontainer = "sourcecontainer"; $account_key = "asdf"; $canonicalizedHeaders = "x-ms-copy-source:https://".$account_name.".blob.core.windows.net/".$sourcecontainer."/".$blobname."\nx-ms-date:$date\nx-ms-version:2015-04-05"; $canonicalizedResource = "/$account_name/$destcontainername/$blobname"; $arraysign = array(); $arraysign[] = 'PUT'; /*HTTP Verb*/ $arraysign[] = ''; /*Content-Encoding*/ $arraysign[] = ''; /*Content-Language*/ $arraysign[] = ''; /*Content-Length (include value when zero)*/ $arraysign[] = ''; /*Content-MD5*/ $arraysign[] = ''; /*Content-Type*/ $arraysign[] = ''; /*Date*/ $arraysign[] = ''; /*If-Modified-Since */ $arraysign[] = ''; /*If-Match*/ $arraysign[] = ''; /*If-None-Match*/ $arraysign[] = ''; /*If-Unmodified-Since*/ $arraysign[] = ''; /*Range*/ $arraysign[] = $canonicalizedHeaders; /*CanonicalizedHeaders*/ $arraysign[] = $canonicalizedResource; /*CanonicalizedResource*/ $stringtosign = implode("\n", $arraysign); $signature = 'SharedKey'.' '.$account_name.':'.base64_encode(hash_hmac('sha256', $stringtosign, base64_decode($account_key), true)); $endpoint = 'https://'.$account_name.'.blob.core.windows.net'; $url = $endpoint.'/'.$destcontainername.'/'.$blobname; $headers = [ 'x-ms-copy-source:https://'.$account_name.'.blob.core.windows.net/'.$sourcecontainer.'/'.$blobname, "x-ms-date:{$date}", 'x-ms-version:2015-04-05', 'Accept:application/json;odata=nometadata', 'Accept-Charset:UTF-8', 'Content-Length:0', "Authorization:{$signature}" ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); echo curl_error($ch); curl_close($ch); echo '<pre>';print_r($response); 

Я хотел бы знать, должен ли я использовать один и тот же API-интерфейс для копирования blob для его выполнения. Если да, то чем будут $canonicalizedHeaders и $canonicalizedResource и resquest rest API. Я могу сделать копию blob с одной учетной записи хранилища на другую с помощью команды powershell ниже

 Start-AzureStorageBlobCopy -DestContainer $destinationContainerName -DestContext $destinationContext -SrcBlob $vhdName -Context $sourceContext -SrcContainer $sourceSAContainerName 

Вы бы использовали один и тот же код для копирования капель по всем учетным записям. В то время как $canonicalizedResource остается неизменным, вам нужно будет указать URL-адрес исходного блоба в заголовке x-ms-copy-source в $canonicalizedHeaders .

Важно помнить, что URL-адрес источника, который вы указываете в заголовке x-ms-copy-source должен быть общедоступным. Это означает, что если вы берете этот URL-адрес и вставляете его в адресную строку браузера, вы должны иметь доступ к блобу. Если ACL источника blob-контейнера является Blob или Container , вы можете просто указать URL-адрес blob ( https://sourceaccountname.blob.core.windows.net/sourceblobcontainer/sourceblobname ), однако, если ACL контейнера источника blob является Private вы можете необходимо создать Shared Access Signature (SAS) в исходном блоке с разрешением не менее Read и использовать URL-адрес SAS для значения этого заголовка.

Другое дело, что копирование через учетные записи хранилища – это асинхронная операция. Поэтому, когда вышеприведенный код успешно выполняется, операция копирования blob помещается в очередь. Вы должны проверить, завершена ли операция копирования перед удалением исходного блога или внесением каких-либо изменений в противном случае операция копирования завершится с ошибкой.