使用 python 将文件从文件存储复制到 blob 存储

Copy file from file storage to blob storage using python

我正在尝试使用 python 将图像从文件存储复制到 blob 存储,但无法使其工作。我基于这个 node.js 示例 。 运行 python 本地代码时出现的异常如下所示。

azure.core.exceptions.ResourceNotFoundError: This request is not authorized to perform this operation using this resource type.

这是 python 代码的片段。

sas_token = generate_account_sas(
    account_name=account_name,
    account_key=account_key,
    resource_types=ResourceTypes(service=True),
    permission=AccountSasPermissions(read=True),
    expiry=datetime.utcnow() + timedelta(hours=1)
)


blob_service_client = BlobServiceClient(account_url=blob_uri, credential=account_key)
container_client = blob_service_client.get_container_client("event")


share_directory_client = ShareDirectoryClient.from_connection_string(conn_str=conn_string, 
                                                        share_name="test-share",
                                                        directory_path="")
dir_list = list(share_directory_client.list_directories_and_files())
logging.info(f"list directories and files : {dir_list}")

for item in dir_list:
    if item['is_directory']:
        pass
    else:
        fileClient = share_directory_client.get_file_client(item['name'])
        source_url = fileClient.url + "?" + sas_token
        logging.info(f"{source_url}")    
        container_client.get_blob_client(item['name']).start_copy_from_url(source_url)

使用 SAS 令牌创建的源 url 如下所示。

https://<STORAGE_NAME>.file.core.windows.net/test-share/test.jpg?se=2021-10-01T05%3A46%3A22Z&sp=r&sv=2020-10-02&ss=f&srt=s&sig=<signature>

您收到此错误的原因是您的 SAS 令牌中的资源类型不正确(srt 值)。

由于您的代码正在将文件复制到 blob 存储,因此您需要将 object 作为允许的资源类型。请参阅此 link 以了解有关资源类型的更多信息。

您的代码将类似于:

sas_token = generate_account_sas(
    account_name=account_name,
    account_key=account_key,
    resource_types=ResourceTypes(object=True),
    permission=AccountSasPermissions(read=True),
    expiry=datetime.utcnow() + timedelta(hours=1)
)

您的 SAS URL 应该类似于:

https://<STORAGE_NAME>.file.core.windows.net/test-share/test.jpg?se=2021-10-01T05%3A46%3A22Z&sp=r&sv=2020-10-02&ss=f&srt=o&sig=<signature>