繁体   English   中英

PHP Azure blob 上传大于允许的大小

[英]PHP Azure blob upload larger than allowed size

我正在使用以下来自另一个答案的解决方案。 但是,它最多只能发送 64MB 的文件。 如何使用此方法发送大文件? 我可以将文件分成几部分,但是一旦发送,我就无法重建它们。

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

如果要使用 PHP 将大文件上传到 Azure Blob 存储,可以使用Azure PHP 存储 SDK

例如

<?php

require_once "vendor/autoload.php"; 

use MicrosoftAzure\Storage\Blob\BlobRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;

use MicrosoftAzure\Storage\Blob\Models\Block;
use MicrosoftAzure\Storage\Blob\Models\CommitBlobBlocksOptions;

define('CHUNK_SIZE', 1024*1024);//Block Size = 1 MB
try {

    $connectionString = "DefaultEndpointsProtocol=https;AccountName=andyprivate;AccountKey=h4pP1fe76m8hdksFW3TvkO6hgw09Mjue7yJOnULPI/g2eU8LGJ+a6k6SrU6dUkOU77waZfU8CacyVMlTWAUA5A==;EndpointSuffix=core.windows.net";
   
    $blobRestProxy = BlobRestProxy::createBlobService($connectionString);
    $containerName = "upload";
    $blobName = "psd7003.xml";
    $fileName="d:/download/psd7003.xml";
    $content = fopen("d:/download/psd7003.xml", "rb");
    $index = 0;
    $continue = True;
    $counter = 1;
    $blockIds = array();
    while (!feof($content))
    {
        $blockId = str_pad($counter, 6, "0", STR_PAD_LEFT);
        $block = new Block();
        $block -> setBlockId(base64_encode($blockId));
        $block -> setType("Uncommitted");
        array_push($blockIds, $block);
        echo $blockId . " | " . base64_encode($blockId) . " | " . count($blockIds);
        echo " \n ";
        echo " -----------------------------------------";
        $data=fread($content, CHUNK_SIZE);
        echo "Read " . strlen($data) . " of data from file";
        echo " \n ";
        echo " -----------------------------------------";
        echo " \n ";
        echo " -----------------------------------------";
        echo "Uploading block : " . $blockId + " into blob storage. Please wait.";
        echo " -----------------------------------------";
        echo " \n ";
        $blobRestProxy -> createBlobBlock($containerName, $blobName, base64_encode($blockId), $data);
        echo "Uploaded block: " . $blockId . " into blob storage. Please wait";
        echo " \n ";
        echo " -----------------------------------------";
        echo " \n ";
        $counter = $counter + 1;
    }
    fclose($content); 
    echo "Now committing block list. Please wait.";
    echo " -----------------------------------------";
    echo " \n ";
    echo "hello";
    $options = new CommitBlobBlocksOptions();
    $option -> setContentType(mime_content_type($fileName));
    $blobRestProxy -> commitBlobBlocks($containerName, $blobName, $blockIds,$options);
    echo " -----------------------------------------";
    echo " \n ";
    echo "Blob created successfully.";
}
catch(Exception $e){
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}
?>

另外,如果你想用rest API来实现,请参考以下步骤

1. 将整个文件读取为字节,并在代码中将文件分成较小的部分。

  • 每件可能 8 MB。

2. 使用Put Block API 上传每

  • 在每个请求中,它包含一个 blockid。

3. 使用Put Block List API 组成 blob。

  • 在这个请求中,你需要将body中的所有blockid按顺序排列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM