Azure Copy blobs from one container to another in same storage account using rest api and php -
i trying copy blob 1 container in same storage account. documentation of azure rest api not clear , not how copy source container destination container how copy blobs 1 storage account storage account.
i have tried copy blob using below code throws error saying "authenticationfailedserver failed authenticate request. make sure value of authorization header formed correctly including signature."
$date = gmdate('d, d m y h: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-version:2015-04-05"; $canonicalizedresource = "/$account_name/$destcontainername/$blobname"; $arraysign = array(); $arraysign[] = 'put'; /*http verb*/ $arraysign[] = ''; /*content-encoding*/ $arraysign[] = ''; /*content-language*/ $arraysign[] = 1; /*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.'/'.$containername.'/blob.png'; $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:1', "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);
- the request header
x-ms-date
required. needs presenting in$canonicalizedheaders
. - if request body none, can set
content-length
0
in request headers. setcontent-length
part of$stringtosign
empty string when using version 2015-02-21 or later.
please try following code:
<?php $date = gmdate('d, d m y h: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);
Comments
Post a Comment