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

如何将无效Blob类型转换为有效Blob类型?BlockBlob上传报错处理

解决方案

核心原因排查与修复步骤

  1. 目标Blob已存在且类型不匹配
    代码中仅判断目标Blob是否存在,但如果已存在的Blob是AppendBlob或PageBlob类型,即使上传时指定BlockBlob也会触发错误。

    • 修复:删除已存在的非BlockBlob类型目标Blob,或者使用全新的Blob名称避免冲突。
  2. 源Blob存在异常状态
    即使日志标记为BlockBlob,也可能存在块未提交、Blob处于快照状态或数据损坏的情况。

    • 修复:
      • 调用old_blob_client.get_block_list()检查所有块是否已提交;
      • 确认操作对象是基础Blob而非快照(快照无法直接作为源进行常规复制)。
  3. SDK版本兼容性问题
    旧版azure-storage-blob SDK可能存在类型判断的逻辑漏洞。

    • 修复:升级至最新版本SDK:
      pip install --upgrade azure-storage-blob
      
  4. 存储账户配置限制
    部分存储账户类型(如高级存储账户)或区域特性可能对Blob类型操作有特殊限制。

    • 修复:检查存储账户的类型与配置,确认支持BlockBlob的创建与写入操作。

优化后的代码示例

增加源Blob类型校验、目标Blob类型检查与冲突处理:

def _upload_small_block_blob(self, container_name, blob_name, new_block_blob_name):
        try:
            blob_service_client = BlobServiceClient.from_connection_string(self._conn_string)
            container_client = blob_service_client.get_container_client(container_name)
            old_blob_client = container_client.get_blob_client(blob_name)
            
            # 校验源Blob类型
            source_props = old_blob_client.get_blob_properties()
            if source_props.blob_type != BlobType.BLOCKBLOB:
                log.error(f"源Blob '{blob_name}' 不是BlockBlob类型,当前类型:{source_props.blob_type}")
                return

            downloaded_data = old_blob_client.download_blob().readall()
            new_blob_client = container_client.get_blob_client(new_block_blob_name)
            
            if new_blob_client.exists():
                target_props = new_blob_client.get_blob_properties()
                if target_props.blob_type != BlobType.BLOCKBLOB:
                    log.info(f"目标Blob '{new_block_blob_name}' 存在但类型不符,正在删除...")
                    new_blob_client.delete_blob()
                else:
                    print(f"Blob '{new_block_blob_name}' 已存在,请更换名称。")
                    return

            new_blob_client.upload_blob(downloaded_data, blob_type="BlockBlob")
            log.info(f"新Block Blob '{blob_name}' 上传成功。")
        except Exception as e:
            log.error(f"上传新Block Blob '{blob_name}' 失败:{str(e)}")

内容的提问来源于stack exchange,提问作者Manoj N D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:52:15