Azure 使用 rest API 将 blob 从一个存储帐户复制到同一订阅中的另一个

开发

我想使用 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 rest API 来完成它。如果是,那么$canonicalizedHeadersand$canonicalizedResource和 resquest rest API将是什么我可以使用下面的 powershell 命令将 blob 从一个存储帐户复制到另一个

Start-AzureStorageBlobCopy -DestContainer $destinationContainerName -DestContext $destinationContext -SrcBlob $vhdName -Context $sourceContext -SrcContainer $sourceSAContainerName
高拉夫曼特里

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用.Net API startCopy将页面Blob从一个存储帐户复制到另一个存储帐户

如何使用Azure Blob存储SDK将Blob从一个容器复制到另一个容器

使用 PySpark 将文件从一个 Azure 存储帐户复制到另一个

将Blob从一个目录复制到同一容器Azure存储中的另一个目录

Azure:无法将存档Blob从一个存储帐户复制到另一个存储帐户?

如何使用Java / REST将Azure Blob从一个存储容器移动到另一个存储容器?

如何使用 Azure 数据工厂将 CSV 文件从 blob 容器复制到另一个 blob 容器?

使用Powershell将项目从一个资源组复制到Azure数据湖存储中的另一个资源组

Azure Pipeline - 使用 YAML 将文件从一个 Repo 复制到另一个 Repo

通过REST API将存储库从另一个帐户导入到Azure DevOps帐户会引发BAD请求

Python:如何将Azure Blob从一个容器移动或复制到另一个容器

AzCopy - 如何从 root$ 开始递归地将所有 blob 从一个存储帐户复制到另一个存储帐户

通过运行手册将一个 blob 容器数据复制到 azure 中的另一个 blob 容器中

使用 python 将文件从 blob 容器复制到另一个容器

将数据库从一个Azure订阅复制到另一个订阅

如何将Azure中的Blob复制到带有节点sdk的另一个容器

使用不带Azure SDK的REST API将流上传到Azure Blob存储

使用 Ansible 将 ssh 公钥从一个帐户复制到另一个帐户

如何使用Powershell将所有秘密从一个Azure Keyvault复制到另一个

如何使用Java API将文件从一个HDFS文件夹复制到另一个HDFS文件夹?

使用 vsts rest api 将 git repo 从一个 vsts 团队项目导入到另一个团队项目

使用REST API和C#将PDF文件上传到Azure Blob存储(不使用任何AZURE STORAGE SDK)

如何使用 azure 函数的元数据将 blob 文档从一个容器移动到另一个容器?

将 azure 数据库从一个订阅复制到 azure 门户上的另一个订阅

使用 pgadmin 将数据行从一个表复制到同一数据库中的另一个表

无法将Blob从一个容器复制到另一个容器

使用Java将数据从一个表复制到Cassandra中的另一个表

Azure管道-解压缩伪影,将一个目录复制到Azure Blob存储YAML文件

将Azure VMS从一个帐户的一个订阅迁移到另一个帐户的另一个订阅的最快方法