如何使用Azure存储Blob服务编程删除未提交块以解决上传报错
错误说明
你遇到的400 InvalidBlobOrBlock错误是Azure Blob存储分块上传场景的常见错误,完整报错信息如下:
code:'InvalidBlobOrBlock' message:'The specified blob or block content is invalid.\nRequestId:1b015a55-201e-00be-7b1c-7e8fb8000000\nTime:2021-07-21T10:35:48.0075829Z' name:'StorageError' requestId:'1b015a55-201e-00be-7b1c-7e8fb8000000' stack:'StorageError: The specified blob or block content is invalid statusCode:400
触发原因是前一次分块上传任务中断后,残留的未提交块和当前重试上传的块ID、块内容匹配规则不一致。未提交块默认会在Azure存储服务中保留7天,到期才会自动清理。
清理未提交块的实现方案
无需单独调用删除接口,给目标块Blob提交空的块列表即可直接清除所有残留的未提交块,不同开发语言的实现示例如下:
- .NET SDK(Azure.Storage.Blobs v12+版本)
// 初始化块Blob客户端 var blockBlobClient = new BlockBlobClient("存储账户连接字符串", "容器名称", "目标Blob名称"); // 提交空块列表,清理全部未提交块 await blockBlobClient.CommitBlockListAsync(new List<string>()); // 执行完成后即可正常重试分块上传
- Python SDK(azure-storage-blob v12+版本)
from azure.storage.blob import BlockBlobClient block_blob_client = BlockBlobClient.from_connection_string( conn_str="存储账户连接字符串", container_name="容器名称", blob_name="目标Blob名称" ) # 提交空块列表清理未提交块 block_blob_client.commit_block_list(block_list=[])
- REST API 实现
直接调用目标Blob的Put Block List接口,请求体中传入空的BlockList节点即可:
<?xml version="1.0" encoding="utf-8"?> <BlockList> </BlockList>
替代方案与注意事项
- 如果业务允许,可直接删除目标Blob后重新上传,操作更简单,调用各SDK的
DeleteIfExists相关接口即可完成 - 若对重试时效要求不高,也可以等待7天,未提交块到期后会被Azure服务自动回收
- 建议每次分块上传任务生成唯一的块ID前缀,避免和历史残留块ID重复,从源头降低该错误的触发概率
内容的提问来源于stack exchange,提问作者s d
相关产品推荐
相关产品推荐

