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

Change DefaulServiceVersion for Azure Blob Storage with PHP/LARAVEL

有人知道如何通过 php/laravel 设置 blob service properties 吗?我在 C# 上看到了他们使用集成 SDK 的答案。我试过了,但我无法开始,因为关于如何将 azure PHP SDK 用于 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);

我不断收到同样的错误: 在 http 请求中找到的 mac 签名与任何计算出的签名不同

我想我没有以正确的方式对 ShareKey 进行编码?

有人吗?

如果要在PHP应用程序中设置blob服务属性,可以使用Azure storage PHP SDK来实现。

例如

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