我想使用 python in block 将文件上传到 azure blob.(使用-put_block)



我正在使用python将文件上传到Azure blob。我想使用 put_block 将文件分成小部分然后上传然后合并来做同样的事情。这样在大文件的情况下,它不会失败。有人可以帮助我吗?我在StackOverflow上尝试了多种解决方案。没有任何工作

from  azure.storage.blob import BlockBlobService
def uploadFile():
    accountey="account-key"
    accountName="account-name"
    containerName="container-name"
    blobService =BlockBlobService(account_name=accountName, account_key=accountey )
    blobService.create_container(containerName)
    blobService.create_blob_from_path(containerName, "image1.jpg", "./images/python.jpg")
uploadFile()

我也试过了,这不起作用:

def upload():
    blob_service.create_container(container_name, None, None, False)
    #blob_service.put_block_blob(container_name, blob_name, '', 'BlockBlob')
    chunk_size = 65536
    block_ids = []
    index = 0
    with open(file_path, 'rb') as f:
        while True:
            data = f.read(chunk_size)
            if data:
                length = len(data)
                block_id = base64.b64encode(bytes(index))
                blob_service.put_block(container_name, blob_name, data, block_id)
                block_ids.append(block_id)
                index += 1
            else:
                break
    resp = blob_service.put_block_list(container_name, blob_name, block_ids)

我在您的代码中看到的一个问题是您使用index变量来创建块 ID。 请注意,块 ID 必须具有相同的长度。在本例中,第一个 10 个块 (0 - 9( 将具有一个长度,然后接下来的 90 个块 (10 - 99( 块将具有不同的长度,这将导致 blob 上传失败。

两种可能的解决方案:

  1. 填充index变量:您可以使用适当数量的零填充index变量,以便它们的长度相等。例如,您可以执行类似 00000001 ....00090010 ...
  2. 使用 UUID 创建块 ID。有关更多详细信息,请参阅这篇文章:如何在 Python 中创建 GUID/UUID。

前段时间我写了一篇关于它的博客文章,你可能会觉得有用:https://gauravmantri.com/2013/05/18/windows-azure-blob-storage-dealing-with-the-specified-blob-or-block-content-is-invalid-error/。

最新更新