【问题标题】:Error 404: azure storage create a new Block错误 404:天蓝色存储创建新块
【发布时间】:2015-11-20 04:03:42
【问题描述】:

我正在尝试在 azure 存储上上传特定的大型图像文件(从 1 MB 到 5 GB)。

对于不超过 2MB 的小文件,其他文件没有问题 我有“您要查找的资源已被删除、更改名称或暂时不可用”。回答。

所以,我尝试使用以下代码将文件分成多个块:

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\Blob\Models\CreateContainerOptions;
use WindowsAzure\Blob\Models\PublicAccessType;
use WindowsAzure\Blob\Models\Block;
use WindowsAzure\Blob\Models\BlobBlockType;

define('CHUNK_SIZE', 1024*1024); //Block Size = 1MB
$connectionString = "DefaultEndpointsProtocol=....";
$blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString);

$uploadfile =$_FILES['fileToUpload']['tmp_name'];
$content = fopen($uploadfile, "r");
$blob_name = $_FILES['fileToUpload']['name'];
$container_name = "natives";

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

        $data = fread($content, CHUNK_SIZE);

        echo " \ n";
        echo "Read ". strlen($data) . "of data from file <br />";
        echo "Uploading block #:". $blockId . "into blob storage. Please wait. <br />";
        $blobRestProxy -> createBlobBlock($container_name, $blob_name, base64_encode($blockIds), $data);

        echo "Uploaded block: ".$blockId . "into blob storage. <br />";

        $counter = $counter + 1;

    }
    echo "Now committing block list. Please wait. <br />";
    $blobRestProxy -> commitBlobBlocks($container_name, $blob_name, $blockIds);
    echo "Blob created successfully. <br />";
}
catch(Exception $e){
    echo "Error <br />";
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
    echo "Files : ".$_FILES['fileToUpload']['name']."<br />";
    echo "content " . $content."<br />";
}
fclose($content);

使用调试模式,问题来自于

$block = new Block();

尽管如此,我包含了“Block”类,所以我不明白这个问题,我不知道如何获得有关此错误的更多信息。我在开发者页面 (POST) 上只有一个白页和一个错误 404。

【问题讨论】:

  • 你能检查你上传 blob 的容器是否存在吗?这可能是您的 404 错误的第一个原因。
  • 谢谢你的回答,但是容器存在,我可以直接添加blob而不需要通过块。

标签: php azure azure-storage azure-blob-storage


【解决方案1】:

所以我尝试了您的代码,但没有收到您遇到的 404 错误。但是我确实发现您的代码有问题。本质上,您需要更改以下代码行:

$blobRestProxy -> createBlobBlock($container_name, $blob_name, base64_encode($blockIds), $data);

$blobRestProxy -> createBlobBlock($container_name, $blob_name, base64_encode($blockId), $data);

完成此操作后,我就可以在我的存储帐户中正确上传文件了。

【讨论】:

    【解决方案2】:

    你的代码有错误:

    $blobRestProxy -> createBlobBlock($container_name, $blob_name, base64_encode($blockIds), $data);
    

    应该是:

    $blobRestProxy -> createBlobBlock($container_name, $blob_name, base64_encode($blockId), $data);
    

    在您的 while 上下文中将 $blockIds 修改为 $blockId

    我已经测试了您的代码,以通过修改将数十 MB 大小的文件上传到 blob 存储。效果很好。

    顺便说一句,如果遇到Maximum execution time异常,可以在PHP脚本中设置set_time_limit()函数或者在php.ini中配置max_execution_time

    【讨论】:

      【解决方案3】:

      我进行了有效的更正,它适用于最大 10Mbs 的文件。所以我尝试使用另一个 62 Mbs 的文件,我得到以下答案:

      Read 0 of data from file 
      Uploading block #:000001 into blob storage. Please wait. 
      Error 
      0: 'blob' can't be NULL or empty.
      Files : 
      content 
      

      这是由于 $_FILES 中文件的大小造成的?还是有别的?

      【讨论】:

      • 读取文件好像失败了,你可以先试试把blob放到文件目录下看看Azure的存储功能,再看看上传的文件。
      猜你喜欢
      • 2015-03-07
      • 2018-05-19
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多