2017-01-16 13 views
0

シンプルなファイル(image.jpg)をローカルサーバーからAzureストレージにアップロードするために、cURLを使用して新しい/簡単なPHPスクリプト/関数を作成する際に問題があります。私は(他の理由で)SDKおよび/または複数のファイル/ライブラリを使用したくありません。私は1つの関数fileUploadだけが必要です。それはそれです。シンプルなPHP cURLファイルをAzureストレージブロブにアップロード

ドキュメントでは、ファイルの上書きによるアップロード(POST)の完全な例は提供されていません。 https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/authentication-for-the-azure-storage-services

また、必要なヘッダーには何があるのか​​、署名/認証属性には何が必要なのかは不明です。インスタンスごとに異なるヘッダを持つ(複数MSDNサイト、 - ?https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/put-blob

誰かが共有したいと思い、この上の簡単な例を持っている

<?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\n" 
     ."x-ms-date:" .$currentDate." GMT\n" 
     ."Content-Type: text/plain; charset=UTF-8\n" 
     ."x-ms-blob-content-disposition: attachment; filename=".$filetoUpload."\n" 
     ."x-ms-blob-type: BlockBlob\n" 
     ."x-ms-meta-m1: v1\n" 
     ."x-ms-meta-m2: v2\n" 
     ; 

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

    $headerText.="Authorization: SharedKey ".$storageAccount.":".$sig."\n"; 
    $headerText.="Content-Length: 280"; 
    $headers = explode("\n", $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); 
+0

。 – evilSnobu

+0

編集した質問と現在の進捗状況 –

答えて

1

次のコードスニペットを試すことができない

<?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\nx-ms-blob-type:BlockBlob\nx-ms-date:$currentDate\nx-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("\n", $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); 
+0

ありがとう、これはそれです小さなtipfelerを修正することをお勧めします - $ authHeaderを挿入してstorageAccount :) –

+1

あなたの提案をお寄せいただきありがとうございますイオン。それを私が直した。 –

+0

また、$ str2signをもっと多くの新しい行で詳しく記述できますか?例えば、$ headersにx-ms-blob-cache-controlを追加する必要があります。 –

関連する問題