使用 python 将图像上传到 azure blob 存储

Posted

技术标签:

【中文标题】使用 python 将图像上传到 azure blob 存储【英文标题】:Upload image to azure blob storage using python 【发布时间】:2020-01-09 00:38:58 【问题描述】:

我有一个名为 images 的图像目录,其中包含以下图像文件:

images
    --0001.png
    --0002.jpg
    --0003.png

现在我想用相同的文件结构将此目录上传到我的 azure blob 存储。我查看了here 和here 给出的示例代码,但是:

    即使安装了azure-blob-storage,那个包里也没有BlobService这样的东西。 是否有明确记录如何执行此操作的地方?

【问题讨论】:

【参考方案1】:

这是我的示例代码,对我来说很好。

import os
from azure.storage.blob import BlockBlobService

root_path = '<your root path>'
dir_name = 'images'
path = f"root_path/dir_name"
file_names = os.listdir(path)

account_name = '<your account name>'
account_key = '<your account key>'
container_name = '<your container name, such as `test` for me>'

block_blob_service = BlockBlobService(
    account_name=account_name,
    account_key=account_key
)

for file_name in file_names:
    blob_name = f"dir_name/file_name"
    file_path = f"path/file_name"
    block_blob_service.create_blob_from_path(container_name, blob_name, file_path)

下图是Azure Storage Explorer的截图。

更多Azure Storage SDK for Python API参考请参考https://azure-storage.readthedocs.io/index.html


更新:我使用的Python版本是Windows上的Python 3.7.4,需要的包是azure-storage==0.36.0,你可以从https://pypi.org/project/azure-storage/找到。

    $ virtualenv test $ cd test $ Scripts\active $ pip install azure-storage

然后,您可以在当前的 Python 虚拟环境中通过python upload_images.py 运行我的示例代码。

【讨论】:

问题是即使安装了azure-blob-storage,这个包里也没有BlockBlobService @mlRocks 请初始化 Python 虚拟环境并安装 azure-storage 包。我已经更新了我的帖子。【参考方案2】:

它在您链接的文档中。

这不是 BlobService,而是 BlobClient。

from azure.storage.blob import BlobClient

blob = BlobClient.from_connection_string("my_connection_string", container="mycontainer", blob="my_blob")

with open("./SampleSource.txt", "rb") as data:
    blob.upload_blob(data)

【讨论】:

【参考方案3】:

目前有两个版本的 azure.storage.blob 。如果你创建一个 Azure VM 并在那里处理数据,你可以使用其中任何一个。

旧版本需要(正如 Adam Marczak 所指出的):

from azure.storage.blob import BlobClient

blob = BlobClient.from_connection_string("my_connection_string", container="mycontainer", blob="my_blob")

with open("./SampleSource.txt", "rb") as data:
    blob.upload_blob(data)

虽然较新:

from azure.storage.blob import BlockBlobService

blob_service = BlockBlobService(account_name, account_key)

blob_service.create_blob_from_path(
    container_name, blob_name ,  full_file_path )

【讨论】:

【参考方案4】:

显然,create_blob_from_bytes 和 BlockBlobService 都不存在于您默认获得的最新 python SDK[1] 中,除非您正在管理各种包的版本。

我假设您可能希望将其作为独立脚本执行。因此,您可以使用 AzureCliCredential[2] 进行身份验证,并通过 SDK 中提供的方法检索必要的资源端点。

以下代码在 Azure Functions 中不起作用。

    from azure.storage.blob import (
       BlobServiceClient,
       ContentSettings
    )

    storage_connection_string='DefaultEndpointsProtocol=https;AccountName=<STORAGE_ACCOUNT_NAME>;AccountKey=<ACCOUNT_KEY>;EndpointSuffix=core.windows.net'
    container_name =
    blob_service_client = BlobServiceClient.(
        conn_str=storage_connection_string
        )
    logging.debug(f'getting client for container : container_name')
    container_client = 
    blob_service_client.get_container_client(container=container_name)
    blob_client = container_client.get_blob_client(blob_name)
    if blob_client.exists():
        blob_client.delete_blob()
    blob_client =blob_service_client.get_blob_client(container=container_name, 
    blob=blob_name)
    try:
        with open(filename, "rb") as data:
             blob.upload(data)
        content_settings =ContentSettings(content_type='image/png')
        logging.debug(f'setting the content type : content_settings')
    except Exception as e:
        logging.error(str(e))

[1]https://docs.microsoft.com/en-us/python/api/azure-storage-blob/azure.storage.blob.blobserviceclient?view=azure-python

[2]https://docs.microsoft.com/en-us/python/api/azure-identity/azure.identity.azureclicredential?view=azure-python

【讨论】:

【参考方案5】:
def upload_file(remote_path,local_path):
    try:
        blobService = BlockBlobService(account_name=SETTINGS.AZURE_ACCOUNT_NAME, account_key=SETTINGS.AZURE_ACCOUNT_KEY)
        blobService.create_blob_from_path('data',remote_path,local_path)
    except Exception as e:
        logger.error(f'Unable to save azure blob data. str(e)')
        raise Exception(f'Unable to save azure blob data. str(e)')

【讨论】:

以上是关于使用 python 将图像上传到 azure blob 存储的主要内容,如果未能解决你的问题,请参考以下文章

将文件上传到 Azure Blob 存储时没有触发事件网格事件——为啥?

使用 Summernote 将图像上传到 Azure Blob

Flutter AZURE BLOB IMAGE UPLOAD - 如何将使用移动相机拍摄的图像上传到 azure blob 存储

Django rest 框架 - 将图像上传到 Azure 存储

使用 Flutter (iOS/Android) 将图像上传到 Azure blob

将签名上传到 Azure Blob 存储