python - 我想在块中使用 python 将文件上传到 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 上传失败。
两种可能的解决方案:
- 填充
index
变量:您可以index
用适当数量的零填充变量,以使它们的长度相等。例如,您可以执行类似0000
,0001
....0009
,0010
... - 使用 UUID 创建块 ID。请参阅这篇文章了解更多详细信息:如何在 Python 中创建 GUID/UUID。
我前段时间写了一篇关于它的博客文章,您可能会觉得有用:https ://gauravmantri.com/2013/05/18/windows-azure-blob-storage-dealing-with-the-specified-blob-or-块内容是无效错误/。
推荐阅读
- javascript - 如何同时检查 Object 和其他字段中的数组是否为空?
- javascript - 如何在 React Native 中创建此模式
- gradle - 在 settings.gradle 文件中如何动态包含所有子项目?
- flutter - 从列表中获取时,颤振类型'String'不是'index'类型'int'的子类型
- calendar - 无法弄清楚为什么 Google 日历无法在 IOS 或移动设备上正确加载
- iis - 我正在尝试使用 servermanager 将 django 应用程序部署到 IIS,我想知道免费域是否可用于本地计算机
- java - Android 11 和 ICC 的问题
- azure - 表单识别器标签工具中 PDF 的“无法加载资产”
- batch-file - 故意的批处理文件异常
- google-analytics - 我有时会在 Tag Assistant 和 Google Analytics 中获得 2 次综合浏览量