【问题标题】:How to upload large block blobs with the Azure PHP SDK by chunking them?如何通过分块使用 Azure PHP SDK 上传大块 Blob?
【发布时间】:2013-07-18 01:53:47
【问题描述】:

我想通过使用 Azure PHP SDK 将大块 blob 分块来将它们上传到 Azure 存储,但我无法在任何地方找到如何执行此操作的示例,那么如何使用 Azure PHP SDK 执行此操作?

【问题讨论】:

  • 请看这个问题:stackoverflow.com/questions/14889413/…。 HTH。
  • @GauravMantri 答案没有用,因为适用于 PHP 的 Azure SDK 不提供答案中提到的 API。此外,我已经查看了源代码,但不清楚如何使用 API - 似乎需要调用特定的工作流程/方法链。

标签: php azure


【解决方案1】:

这是一个工作示例。我使用了上面链接中提到的相同的两个函数。

<?php 
require_once 'WindowsAzure/WindowsAzure.php';
use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\Blob\Models\Block;
use WindowsAzure\Blob\Models\BlobBlockType;
define('CHUNK_SIZE', 1024*1024);//Block Size = 1 MB
try {

    $connectionString = "UseDevelopmentStorage=true";
    $instance = ServicesBuilder::getInstance();
    $blobRestProxy = $instance -> createBlobService($connectionString);
    $containerName = "mycontainer";
    $blobName = "DSC01166.jpg";
    $content = fopen("d:\DSC01166.jpg", "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";
    $blobRestProxy -> commitBlobBlocks($containerName, $blobName, $blockIds);
    echo " -----------------------------------------";
    echo " \n ";
    echo "Blob created successfully.";
}
catch(Exception $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here: 
    // http://msdn.microsoft.com/en-us/library/windowsazure/dd179439.aspx
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}
?>

希望这会有所帮助。

【讨论】:

  • 感谢您的样品!我会尽快查看并在测试后接受答案。
  • 嗨,这不起作用。上传 5-6 个块后,它挂起,然后引发格式错误的响应错误。还有一个小错字 -> count(blockIds) 应该是 count($blockIds)。想法?
  • 您能分享您遇到的确切错误吗?如果您通过 Fiddler 之类的工具跟踪您的请求/响应,这也会有所帮助,这样您就可以准确地知道通过网络发送的内容。不幸的是,我对 PHP 的了解有限。我用存储模拟器尝试了这个,并使用上面的代码上传了大约 4 MB 的文件,它对我来说没问题。
  • 我发现 HTTP 有效但 HTTPS 无效,因此我正在调查潜在的 CA/证书问题。
  • 对 linux 上的 HTTPS 问题有什么想法吗?我已将 blob 存储证书添加为受信任以防万一,但仍然无法正常工作(同样的错误)
猜你喜欢
  • 2013-01-31
  • 2021-11-10
  • 2020-03-04
  • 2020-08-12
  • 2016-04-05
  • 2018-09-20
  • 2012-02-18
  • 2019-08-10
  • 2019-04-21
相关资源
最近更新 更多