【问题标题】:Azure copy blobs from one storage account to another in the same subscription using rest APIAzure 使用 REST API 将 Blob 从一个存储帐户复制到同一订阅中的另一个帐户
【发布时间】:2017-04-19 11:37:03
【问题描述】:

我想使用 Rest API 和 PHP 将 blob 从一个存储帐户复制到同一订阅中的另一个存储帐户。我可以使用以下代码在同一存储帐户中从一个容器复制 blob 到另一个容器

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

我想知道我是否必须使用相同的复制 blob 休息 API 来完成它。如果是,那么 $canonicalizedHeaders$canonicalizedResource 和 resquest rest API 将是什么。我可以使用下面的 powershell 命令将 blob 从一个存储帐户复制到另一个帐户

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

【问题讨论】:

    标签: php rest azure azure-blob-storage


    【解决方案1】:

    您也可以使用相同的代码跨存储帐户复制 blob。尽管$canonicalizedResource 保持不变,但您需要在$canonicalizedHeadersx-ms-copy-source 标头中包含源blob 的URL。

    要记住的重要一点是,您在 x-ms-copy-source 标头中指定的源 blob URL 必须是可公开访问的。这意味着如果您获取该 URL 并将其粘贴到浏览器的地址栏中,您应该能够访问该 blob。如果源 blob 容器的 ACL 是 BlobContainer,那么您可以简单地指定 blob URL (https://sourceaccountname.blob.core.windows.net/sourceblobcontainer/sourceblobname) 但是如果源 blob 容器的 ACL 是 Private,那么您需要在至少具有Read 权限的源 blob,并将 SAS URL 用于此标头的值。

    要了解的另一件事是,跨存储帐户复制是一种异步操作。所以当上面的代码执行成功时,blob复制操作就排队了。在删除源 blob 或对其进行任何更改之前,您必须检查复制操作是否已完成,否则复制操作将失败。

    【讨论】:

    • 感谢高拉夫的回复。在这里,我尝试将 vhd 文件从 OSdisk 和数据磁盘从源存储帐户复制到目标存储帐户。 canonicalizedResource 和 canonicalizedHeaders 还是一样吗?
    • 是的。从概念上讲,无论您复制到同一帐户还是跨帐户,该过程都是相同的。在这两种情况下,您都将调用Copy Blob REST API。这些值将根据您尝试复制的内容和位置(即源和目标 blob 信息)而变化。 HTH。
    • 我不想让我的 blob 可以公开访问,所以在这种情况下,我应该为源存储帐户和目标存储帐户生成 SAS 令牌,如果我这样做的话,我应该如何传递curl 标头中的 SAS 令牌。
    • 您需要为源 blob 创建 SAS URL 并将其包含在您的“x-ms-copy-source”标头中。
    • 在 fiddles 复制 blob 操作的请求标头中,我发现了这个x-ms-copy-source:https://sourceSAName.blob.core.windows.net/vhds/vhdName?sv=2015-04-05&amp;sr=b&amp;sig=sdfdsfsfddsf&amp;se=2017-04-27T06:55:57Z&amp;sp=r。在这里我可以找到一些其他参数,如 sv、sr、se 和 sp。这些参数是干什么用的
    猜你喜欢
    • 2023-04-06
    • 2021-08-25
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多