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.window‌​s.net/".$sourcecontainer."/".$blobname."\n‌​x-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.window‌​s.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. set content-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

Popular posts from this blog

php - Permission denied. Laravel linux server -

google bigquery - Delta between query execution time and Java query call to finish -

python - Pandas two dataframes multiplication? -