简单的PHP cURL文件上传到Azure存储blob

I have issues to create a new/simple PHP script/function with cURL to upload simple file (image.jpg) from local server to Azure storage - blob container using Shared Key authentication. I do not want (for other reasons) use SDK and/or multiple files/libraries. I need only one function - fileUpload - and that is it.

Documentation does not provide complete example for upload (POST) with file overwrite. https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/authentication-for-the-azure-storage-services

It is also unclear what are required headers to have, and what are required headers to have for signature / authentication attribute. (multiple MSDN sites with different headers, for instance - https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/put-blob

Does someone has simple example on this that would like to share?

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
date_default_timezone_set('UTC');

$destinationURL = 'https://mystorage.blob.core.windows.net/blob1/image.jpg';
$accesskey = "qJXTMmw2Esal8/tXgfWk0RLwMNJ6OQKEt0E8EMZ8VhQrzGi5uqJqeKvi1l7iqnOddp7bdtai5rPpC6ynHttl1w==";
$storageAccount = 'mystorage';
$filetoUpload = realpath('./image.jpg');

function upload($filetoUpload, $storageAccount,$destinationURL,$accesskey) {
    $currentDate = date("D, d M Y H:i:s");

    $postFields = array(
        'extra_info' => '123456',
        'file_contents'=>'@'.$filetoUpload
    );

    $headerText=""
        ."x-ms-version: 2015-02-21
"  
        ."x-ms-date:" .$currentDate." GMT
"
        ."Content-Type: text/plain; charset=UTF-8
"  
        ."x-ms-blob-content-disposition: attachment; filename=".$filetoUpload."
"  
        ."x-ms-blob-type: BlockBlob
"  
        ."x-ms-meta-m1: v1
"  
        ."x-ms-meta-m2: v2
"  
        ;

    $hash = hash_hmac('sha256', $headerText, base64_decode($accesskey), true);
    $sig = base64_encode($hash);

    $headerText.="Authorization: SharedKey ".$storageAccount.":".$sig."
";
    $headerText.="Content-Length: 280";
    $headers = explode("
", $headerText);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_URL, $destinationURL);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $result = curl_exec($ch);
    echo ('Result<br/>');
    print_r($result);
    echo ('Error<br/>');
    print_r(curl_error($ch));
    curl_close ($ch);
return;
}

upload($filetoUpload, $storageAccount,$destinationURL,$accesskey);
dphphvs496524
dphphvs496524 编辑问题并给出当前进展
3 年多之前 回复
dprfe04886
dprfe04886 那么,到目前为止你做了什么?
3 年多之前 回复

1个回答

You can try the following code snippet.

<?php

$accesskey = "qJXTMmw2Esal8/tXgfWk0RLwMNJ6OQKEt0E8EMZ8VhQrzGi5uqJqeKvi1l7iqnOddp7bdtai5rPpC6ynHttl1w==";
$storageAccount = 'mystorage';
$filetoUpload = realpath('./image.jpg');
$containerName = '<yourblobcontainer>';
$blobName = 'image.jpg';

$destinationURL = "https://$storageAccount.blob.core.windows.net/$containerName/$blobName";

function uploadBlob($filetoUpload, $storageAccount, $containerName, $blobName, $destinationURL, $accesskey) {

    $currentDate = gmdate("D, d M Y H:i:s T", time());
    $handle = fopen($filetoUpload, "r");
    $fileLen = filesize($filetoUpload);

    $headerResource = "x-ms-blob-cache-control:max-age=3600
x-ms-blob-type:BlockBlob
x-ms-date:$currentDate
x-ms-version:2015-12-11";
    $urlResource = "/$storageAccount/$containerName/$blobName";

    $arraysign = array();
    $arraysign[] = 'PUT';               /*HTTP Verb*/  
    $arraysign[] = '';                  /*Content-Encoding*/  
    $arraysign[] = '';                  /*Content-Language*/  
    $arraysign[] = $fileLen;            /*Content-Length (include value when zero)*/  
    $arraysign[] = '';                  /*Content-MD5*/  
    $arraysign[] = 'image/png';         /*Content-Type*/  
    $arraysign[] = '';                  /*Date*/  
    $arraysign[] = '';                  /*If-Modified-Since */  
    $arraysign[] = '';                  /*If-Match*/  
    $arraysign[] = '';                  /*If-None-Match*/  
    $arraysign[] = '';                  /*If-Unmodified-Since*/  
    $arraysign[] = '';                  /*Range*/  
    $arraysign[] = $headerResource;     /*CanonicalizedHeaders*/
    $arraysign[] = $urlResource;        /*CanonicalizedResource*/

    $str2sign = implode("
", $arraysign);

    $sig = base64_encode(hash_hmac('sha256', urldecode(utf8_encode($str2sign)), base64_decode($accesskey), true));  
    $authHeader = "SharedKey $storageAccount:$sig";

    $headers = [
        'Authorization: ' . $authHeader,
        'x-ms-blob-cache-control: max-age=3600',
        'x-ms-blob-type: BlockBlob',
        'x-ms-date: ' . $currentDate,
        'x-ms-version: 2015-12-11',
        'Content-Type: image/png',
        'Content-Length: ' . $fileLen
    ];

    $ch = curl_init($destinationURL);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_setopt($ch, CURLOPT_INFILE, $handle); 
    curl_setopt($ch, CURLOPT_INFILESIZE, $fileLen); 
    curl_setopt($ch, CURLOPT_UPLOAD, true); 
    $result = curl_exec($ch);

    echo ('Result<br/>');
    print_r($result);

    echo ('Error<br/>');
    print_r(curl_error($ch));

    curl_close($ch);
}

uploadBlob($filetoUpload, $storageAccount, $containerName, $blobName, $destinationURL, $accesskey);
dongyan5239
dongyan5239 我已经更新了我的答案。 请看那:)
3 年多之前 回复
doujiao7483
doujiao7483 你还可以用这么多新行来详细说明$ str2sign,例如我需要在$ headers中添加x-ms-blob-cache-control ....
3 年多之前 回复
dow57588
dow57588 谢谢你的建议。 我修好了它。
3 年多之前 回复
doutui8842
doutui8842 谢谢,就是这样。 我建议修复小的tipfeler - $ authHeader来插入storageAccount :)
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问