这是您想要使用最新版本(v12)执行的操作根据文档,
复制操作的源 blob 可以是块 blob、附加 blob 或页 blob。如果目标 blob 已存在,则它必须与源 blob 具有相同的 blob 类型。
现在,您不能使用 start_copy_from_url 来指定 blob 类型。但是,在某些情况下,您可以使用同步复制 APIS 来执行此操作。
例如,对于块到页 Blob,首先创建目标页 Blob,然后在目标上调用update_range_from_url
,每个块来自源 4 MB。
同样,在您的情况下,首先创建一个空块 blob 并使用stage_block_from_url
方法.
from azure.storage.blob import ContainerClient
import os
conn_str = os.getenv("AZURE_STORAGE_CONNECTION_STRING")
dest_blob_name = "mynewblob"
source_url = "http://www.gutenberg.org/files/59466/59466-0.txt"
container_client = ContainerClient.from_connection_string(conn_str, "testcontainer")
blob_client = container_client.get_blob_client(dest_blob_name)
# upload the empty block blob
blob_client.upload_blob(b'')
# this will only stage your block
blob_client.stage_block_from_url(block_id=1, source_url=source_url)
# now it is committed
blob_client.commit_block_list(['1'])
# if you want to verify it's committed now
committed, uncommitted = blob_client.get_block_list('all')
assert len(committed) == 1
如果这不起作用,请告诉我。
编辑:您可以利用source_offset
和source_length
参数以块的形式上传块。例如,
stage_block_from_url(block_id, source_url, source_offset=0, source_length=10)
将上传前 10 个字节,即从 0 到 9 的字节。因此,您可以使用计数器来不断增加 block_id 并跟踪您的偏移量和长度,直到用完所有块。
编辑2:
for step in range(....):
###
blob.stage_block_from_url(...)
##do not commit it##
#outside the for loop
blob.commit_block_list([j for j in range(i+1)]) (#or i+2?)