You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP分块上传数据到Azure Blob Storage

Azure Storage PHP SDK 流式分块上传实现方案

你需要的逐块读取、低内存开销的上传逻辑完全可以实现,依托Azure Block Blob的分块上传机制,完全适配你给出的while ($data = fread())代码结构,不会将整个文件加载到内存。

实现步骤

  • 初始化Blob存储客户端,提前配置好账户名、密钥等连接参数即可
  • 以二进制只读模式打开本地文件句柄,避免额外内存占用
  • 循环读取指定大小的文件片段,逐个上传为Blob块,同时记录块ID信息
  • 所有块上传完成后,提交块列表拼接为完整Blob
  • 最后关闭文件句柄

完整代码示例

<?php
use MicrosoftAzure\Storage\Blob\BlobRestProxy;
use MicrosoftAzure\Storage\Blob\Models\Block;

// 1. 初始化Blob客户端
$connectionString = "DefaultEndpointsProtocol=https;AccountName=你的账户名;AccountKey=你的账户密钥;";
$blobClient = BlobRestProxy::createBlobService($connectionString);

$containerName = "你的容器名";
$blobName = "要上传的目标Blob名称";
$localFilePath = "本地文件路径";
$chunkSize = 8192; // 可自定义块大小,最低可到1B,最大支持4000MiB

// 2. 打开文件句柄
$fileHandle = fopen($localFilePath, 'rb');
if (!$fileHandle) {
    throw new \Exception("无法打开文件");
}

$blockList = [];
$blockId = 0;

// 3. 逐块读取上传,完全符合你需要的循环逻辑
while (!feof($fileHandle)) {
    $chunkData = fread($fileHandle, $chunkSize);
    if ($chunkData === false) break;

    // 生成唯一且有序的块ID,要求为等长base64字符串
    $currentBlockId = base64_encode(sprintf('%08d', $blockId));
    
    // 上传单个块
    $blobClient->createBlobBlock($containerName, $blobName, $currentBlockId, $chunkData);
    
    // 记录块信息,后续提交用
    $block = new Block();
    $block->setBlockId($currentBlockId);
    $block->setType('Uncommitted');
    $blockList[] = $block;
    
    $blockId++;
}

// 4. 提交所有块,拼接为完整Blob
$blobClient->commitBlobBlocks($containerName, $blobName, $blockList);

// 5. 关闭文件句柄
fclose($fileHandle);

注意事项

  • 若对性能要求更高,可将$chunkSize调整为2MB~4MB,平衡内存占用和上传请求数
  • 单块最大支持4000MiB,整个Block Blob最大支持190.7TiB,可覆盖绝大多数大文件上传场景
  • 若上传过程中某块失败,可单独重试对应块,无需重传整个文件
  • 整个过程中内存仅存储当前读取的单个块内容,不会加载全量文件,内存开销稳定可控

内容的提问来源于stack exchange,提问作者ThatGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:45:05