使用PHP/LARAVEL更改Azure Blob存储的DefaulServiceVersion

使用PHP/LARAVEL更改Azure Blob存储的DefaulServiceVersion,php,laravel,azure,api,sdk,Php,Laravel,Azure,Api,Sdk,有没有可能有人知道如何通过php/laravel设置?我在C#上看到了答案,他们使用集成SDK。我试过了,但我无法开始,因为关于如何使用azure PHP SDK for Laravel的信息很少,或者我不明白 我尝试过但失败了: $date = gmdate('D, d M Y H:i:s \G\M\T'); $account_name = "**************"; $containername = "media";

有没有可能有人知道如何通过php/laravel设置?我在C#上看到了答案,他们使用集成SDK。我试过了,但我无法开始,因为关于如何使用azure PHP SDK for Laravel的信息很少,或者我不明白

我尝试过但失败了:

 $date = gmdate('D, d M Y H:i:s \G\M\T');
    $account_name = "**************";
    $containername = "media";
    $access_key = "access_key_from_portal";

    $canonicalizedHeaders  = "x-ms-date:$date\nx-ms-version:2017-11-09";
    // $canonicalizedResource = "/$account_name/$containername\ncomp:list\nrestype:container";
    // $canonicalizedResource = "/$account_name\nrestype:service\ncomp:properties";
    $canonicalizedResource = "/$account_name /$containername\ncomp:metadata\nrestype:container\ntimeout:20";



    $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', utf8_encode($stringtosign), base64_decode($access_key)));
    $endpoint = 'https://' . $account_name . '.blob.core.windows.net';
    // $endpoint = 'https://management.azure.com/subscriptions/df4efeca-7f1e-44cd-b037-5ced337b68b0/resourceGroups/PiHealthcare/providers/Microsoft.Storage/storageAccounts/preceptorshipblobstorage?api-version=2019-06-01';

    $url = $endpoint . '/' . '?restype=service&comp=properties';

    $headers = [
        "Content-Length:0",
        "x-ms-date:{$date}",
        'x-ms-version:2017-11-09',
        'Accept:application/json;odata=nometadata',
        "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);
    echo '<hr>';
    print_r($signature);
    echo '<pre>';
    print_r($date);
    echo '<hr>';
    print_r($stringtosign);
    echo '<hr>';
    print_r($canonicalizedHeaders);
$date=gmdate('D,dm Y H:i:s\G\M\T');
$account_name=“****************”;
$containername=“媒体”;
$access\u key=“从门户访问”;
$canonicalizedHeaders=“x-ms-date:$date\nx ms版本:2017-11-09”;
//$canonicalizedResource=“/$account\u name/$containername\ncomp:list\nrestype:container”;
//$canonicalizedResource=“/$account\u name\nrestype:service\ncomp:properties”;
$canonicalizedResource=“/$account\u name/$containername\ncomp:metadata\nrestype:container\ntimeout:20”;
$arraysign=array();
$arraysign[]='PUT'/*HTTP动词*/
$arraysign[]=''/*内容编码*/
$arraysign[]=''/*内容语言*/
$arraysign[]=''/*内容长度(包括零时的值)*/
$arraysign[]=''/*Content-MD5*/
$arraysign[]=''/*内容类型*/
$arraysign[]=''/*日期*/
$arraysign[]=''/*如果修改自*/
$arraysign[]=''/*如果匹配*/
$arraysign[]=''/*如果没有匹配*/
$arraysign[]=''/*如果未修改自*/
$arraysign[]=''/*射程*/
$arraysign[]=$canonicalizedHeaders/*标准化领导者*/
$arraysign[]=$canonicalizedResource/*标准化数据源*/
$stringtosign=内爆(“\n”,$arraysign);
$signature='SharedKey'。“$帐户名称。“:”。base64_编码(hash_hmac('sha256',utf8_编码($stringtosign),base64_解码($access_key));
$endpoint='https://'$账户名称。blob.core.windows.net';
//$endpoint=https://management.azure.com/subscriptions/df4efeca-7f1e-44cd-b037-5ced337b68b0/resourceGroups/PiHealthcare/providers/Microsoft.Storage/storageAccounts/preceptorshipblobstorage?api-版本=2019-06-01';
$url=$endpoint.'/'?重新类型=服务&组件=属性';
$headers=[
“内容长度:0”,
“x-ms-date:{$date}”,
“x-ms-version:2017-11-09”,
'Accept:application/json;odata=nometadata',
“授权:{$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\u exec($ch);
回波旋度误差($ch);
卷曲关闭($ch);
回声';
打印(回复);
回声“
”; 打印(签名); 回声'; 打印(日期); 回声“
”; 打印(stringtosign); 回声“
”; 印刷品(标准化领导者);
我总是会遇到同样的错误: http请求中找到的mac签名与任何计算签名不同

我想我没有用正确的方式对共享密钥进行编码


某人?

如果您想在PHP应用程序中设置blob服务属性,可以使用来实现它

比如说

$connectionString='DefaultEndpointsProtocol=https;AccountName=;AccountKey=';
$blobClient=BlobRestProxy::createBlobService($connectionString);
echo“获取Blob服务属性”。PHP_EOL;
$originalProperties=$blobClient->getServiceProperties();
//设置blob服务属性
echo“设置Blob服务属性”。PHP_EOL;
$retentionPolicy=新的retentionPolicy();
$retentionPolicy->setEnabled(真);
$retentionPolicy->setDays(10);
$logging=新日志记录();
$logging->setRetentionPolicy($retentionPolicy);
$logging->setVersion('1.0');
$logging->setDelete(true);
$logging->setRead(true);
$logging->setWrite(true);
$metrics=新指标();
$metrics->setRetentionPolicy($retentionPolicy);
$metrics->setVersion('1.0');
$metrics->setEnabled(true);
$metrics->setIncludeAPIs(true);
$serviceProperties=新的serviceProperties();
$serviceProperties->setLogging($logging);
$serviceProperties->setHourMetrics($metrics);
$blobClient->setServiceProperties($serviceProperties);
//恢复到原始属性
echo“恢复到原始服务属性”。PHP_EOL;
$blobClient->setServiceProperties($originalProperties->getValue());
回显“服务属性示例已完成”。PHP_EOL;

感谢您的回答,我正在从我的web routes中调用此代码,作为控制器中的Get方法。不确定这样做是否正确,因为它需要PUT请求?
   $connectionString = 'DefaultEndpointsProtocol=https;AccountName=<yourAccount>;AccountKey=<yourKey>';
    $blobClient = BlobRestProxy::createBlobService($connectionString);
    echo "Get Blob Service properties" . PHP_EOL;
    $originalProperties = $blobClient->getServiceProperties();
    // Set blob service properties
    echo "Set Blob Service properties" . PHP_EOL;
    $retentionPolicy = new RetentionPolicy();
    $retentionPolicy->setEnabled(true);
    $retentionPolicy->setDays(10);

    $logging = new Logging();
    $logging->setRetentionPolicy($retentionPolicy);
    $logging->setVersion('1.0');
    $logging->setDelete(true);
    $logging->setRead(true);
    $logging->setWrite(true);

    $metrics = new Metrics();
    $metrics->setRetentionPolicy($retentionPolicy);
    $metrics->setVersion('1.0');
    $metrics->setEnabled(true);
    $metrics->setIncludeAPIs(true);
    $serviceProperties = new ServiceProperties();
    $serviceProperties->setLogging($logging);
    $serviceProperties->setHourMetrics($metrics);
    $blobClient->setServiceProperties($serviceProperties);

    // revert back to original properties
    echo "Revert back to original service properties" . PHP_EOL;
    $blobClient->setServiceProperties($originalProperties->getValue());
    echo "Service properties sample completed" . PHP_EOL;