使用新的 azure.storage.blob 包解决文件上传超时错误

Vin*_*mel 4 python azure-blob-storage

我必须升级一个使用旧版本的 microsoft azure python 包从 api 下载数据的 docker 容器,然后将 json 上传到 Azure Blob 存储。因此,由于不再允许使用以前的“azure”元包的 pip 安装,我必须使用新的独立包(azure-storage-blob==12.6.0)。

从旧“azure”包中集成的 blockblobservice 中的函数“create_blob_from_path”切换到新的独立包,BlobClient.upload() 在较大文件上失败,并出现超时错误,完全忽略函数的超时参数。

我收到 ServiceResponseError 消息“连接中止/写入操作超时”

有什么办法可以解决这个错误吗?

新函数感觉像是从 create_blob_from_path 向后退了一大步,缺少progress_callback 主要是令人遗憾的......

小智 7

如果您的控制流允许,正确的解决方案似乎是max_single_put_size创建BlobClient. 您可以在调用构造函数时使用关键字参数来完成此操作。

但是,据我所知,如果通过BlobClient.from_blob_url控制流创建 BlobClient,则无法配置此参数。默认值为 64MB,在 64MB PUT 完成之前很容易达到默认连接超时。在某些应用程序中,您可能无权访问存储帐户的身份验证凭据(即您只是使用签名的 URL),因此创建 的唯一方法BlobClient是通过BlobClient.from_blob_url调用。

解决方法似乎是connection_timeoutupload_blob调用中设置记录不完整的参数,而不是timeout参数。所以,像这样:

upload_result = block_blob_client.upload_blob(
    data,
    blob_type="BlockBlob",
    content_settings=content_settings,
    length=file_size,
    connection_timeout=600,
)
Run Code Online (Sandbox Code Playgroud)

该参数记录在此页面上:

https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-blob#other-client--per-operation-configuration

然而,目前官方文档中还没有BlobClient记录:

https://learn.microsoft.com/en-us/python/api/azure-storage-blob/azure.storage.blob.blobclient?view=azure-python

我已提交此文档错误:https://github.com/Azure/azure-sdk-for-python/issues/22936

  • 只是为了向阅读本文的其他人强调,需要设置connection_timeout,特别是在通过相对较慢的连接(例如1MB/秒)上传时。Connection_timeout 设置是 SDK 中记录不当、实施不当的设置。我花了几个小时寻找其他解决方案。在查看文档后,我已经设置了 max_single_put_size 和其他类似的设置,但 upload_blob() 在大约 2-3 分钟后仍然失败。 (4认同)