如何使用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
相关产品推荐
相关产品推荐

