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

如何验证Azure Blob是否成功归档上传并获取上传结果?

Azure Blob上传归档验证与任务清理方案

一、统一使用新版BlobServiceClient(替换旧版BlockBlobService)

建议统一采用Azure Storage SDK for Python 12.x+版本的BlobServiceClient,旧版BlockBlobService已停止维护,新版功能更完善且适配归档存储层的状态校验。

二、上传阶段直接捕获成功/失败+归档状态

上传时无需事后单独检查,通过SDK返回结果和异常捕获直接判断上传及归档状态:

from azure.storage.blob import BlobServiceClient
import asyncio

async def upload(work_item):
    account_name = "你的存储账户名"
    account_key = "你的存储账户密钥"
    container_name = "works"
    blob_name = work_item["filename"]
    local_file_path = work_item["local_path"]
    
    try:
        # 初始化Blob服务客户端
        blob_service_client = BlobServiceClient.from_connection_string(
            f"DefaultEndpointsProtocol=https;AccountName={account_name};AccountKey={account_key};EndpointSuffix=core.windows.net"
        )
        blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
        
        # 上传并直接指定归档存储层
        with open(local_file_path, "rb") as data:
            blob_properties = blob_client.upload_blob(
                data,
                overwrite=True,
                standard_blob_tier="Archive"  # 强制上传至归档层
            )
        
        # 即时验证归档状态
        if blob_properties.access_tier == "Archive":
            return True, "上传并归档成功"
        else:
            return False, "上传成功但未进入归档状态"
    
    except Exception as e:
        # 捕获所有上传异常:网络错误、权限不足、文件损坏等
        return False, f"上传失败: {str(e)}"

三、事后批量验证Blob归档状态的函数

如果需要对已上传的Blob做批量校验,可实现以下函数:

async def is_blob_archived(blob_name, container_name="works"):
    account_name = "你的存储账户名"
    account_key = "你的存储账户密钥"
    
    try:
        blob_service_client = BlobServiceClient.from_connection_string(
            f"DefaultEndpointsProtocol=https;AccountName={account_name};AccountKey={account_key};EndpointSuffix=core.windows.net"
        )
        blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
        
        # 获取Blob属性,同时验证存在性与归档状态
        blob_properties = blob_client.get_blob_properties()
        return (
            blob_properties.exists 
            and blob_properties.access_tier == "Archive" 
            and blob_properties.access_tier_change_time is not None
        )
    
    except Exception as e:
        print(f"校验Blob {blob_name} 出错: {str(e)}")
        return False

四、任务清理逻辑

结合上传结果或批量校验结果,清理已成功归档的任务:

async def process_tasks(tasks):
    # 方式1:上传后即时判断并清理
    for task in tasks:
        success, msg = await upload(task)
        if success:
            print(f"任务 {task['filename']} 完成,执行清理")
            # 这里写删除任务的逻辑:比如删除本地文件、标记数据库状态等
            # os.remove(task['local_path'])
        else:
            print(f"任务 {task['filename']} 失败: {msg},保留任务")
    
    # 方式2:批量校验已上传任务并清理
    # for task in tasks:
    #     if await is_blob_archived(task['filename']):
    #         # 执行清理逻辑
    #         pass
    #     else:
    #         # 保留任务,可触发重试上传
    #         pass

关键注意事项

  • 归档状态延迟:若将已存在的Blob从热/冷层转换至归档层,会短暂处于rehydrate_pending状态,此时需等待转换完成再校验;直接上传至归档层的Blob会立即进入Archive状态。
  • 异常覆盖:上传时需捕获所有可能的异常,包括网络中断、权限不足、本地文件缺失等,这些场景均属于上传失败,任务需保留。
  • SDK版本要求:确保安装新版SDK:pip install azure-storage-blob>=12.0.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:54:20