Azure Копирование больших двоичных объектов из одного контейнера в другой в той же учетной записи хранения, используя остальные API и переполнение стека.

Я пытаюсь скопировать BLOB-объект из одного контейнера в другой в той же учетной записи хранения. Документация по Azure Rest API не ясна и не говорит, как копировать из исходного контейнера в целевой контейнер, а также как копировать большие двоичные объекты из одной учетной записи хранения в другую учетную запись хранения.

Я попытался скопировать BLOB-объект с помощью приведенного ниже кода, он выдает ошибку, говоря «AuthenticationFailedServer не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись.«

$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);

0

Решение

  • Заголовок запроса x-ms-date необходимо. Это также нуждается в представлении
    в $canonicalizedHeaders,
  • Если тело запроса отсутствует, вы можете установить Content-Length в 0 в
    Заголовки запроса. Затем установите Content-Length часть
    $stringtosign в пустую строку при использовании версии 2015-02-21
    или позже.

Пожалуйста, попробуйте следующий код:

<?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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector