将文件保存到 Azure Blob

5
我正在使用以下Python代码将文件保存到本地文件夹。我想直接将此文件保存到Azure Blob中,而不是先存储在本地,然后再上传到Blob。
我尝试将Blob位置放在文件夹变量中,但没有成功。 我有一个Excel文件,我想从Web浏览器中读取并使用Python保存到Azure Blob中。
 folder = 'Desktop/files/ab'
    
 r = requests.get(api_end_point, headers=api_headers, stream=True)
 with open(folder, 'wb') as f:
    f.write(r.content)

如果我理解正确的话,您正在从API端点读取文件,然后想要将此文件的内容上传到Blob存储中,而无需先在本地保存它。是这样吗? - Gaurav Mantri
是的,你是正确的。 - Andrew
1
很遗憾,如果不下载内容是不可能的。但是您无需将其保存为本地文件。您可以直接读取流并使用该流创建一个 blob。 - Gaurav Mantri
如果您能将此代码放在问题本身中,我们将不胜感激。在评论中它并不容易阅读,而且有些东西会在评论中丢失。谢谢。 - Gaurav Mantri
你应该能够将流传递给你的 upload_blob 方法。因为你正在传递流,所以不需要使用 blob_output = StringIO() blob_output.write(contents)。你可以试一下吗? - Gaurav Mantri
显示剩余6条评论
1个回答

5

首先,您应该把文件作为类似于流的东西获取。

import os
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient

connect_str = os.getenv('str')
blob_service_client = BlobServiceClient.from_connection_string(connect_str)
container_name = "test"
container_client = blob_service_client.get_container_client(container_name)
blob_client = blob_service_client.get_blob_client(container_name, "MyFirstBlob.txt")
blob_client.upload_blob(req.get_body(), blob_type="BlockBlob")

我会将数据放在请求体中,然后上传到 Azure Blob。它是流式的。你也可以在其中放置一个流。
这些是官方文档:
https://learn.microsoft.com/zh-cn/azure/storage/blobs/storage-quickstart-blobs-python#upload-blobs-to-a-container
https://learn.microsoft.com/zh-cn/azure/developer/python/sdk/storage/azure-storage-blob/azure.storage.blob.blobserviceclient?view=storage-py-v12
https://learn.microsoft.com/zh-cn/azure/developer/python/sdk/storage/azure-storage-blob/azure.storage.blob.blobclient?view=storage-py-v12#upload-blob-data--blob-type--blobtype-blockblob---blockblob----length-none--metadata-none----kwargs-

谢谢。你能帮我定义一下你是如何将数据放入req对象中的吗? - Andrew
1
@Andrew 在我的端上,我只是使用Postman来发送数据。你不必在upload_blob()方法中放置req body,只需要任何流就可以了。 - Cindy Pau
1
@Andrew 在我的代码中,我使用了 req.get_body() 方法,但你不需要这样做。只需将其替换为要上传的流即可。在你的代码中,你可以将 Excel 文件读取为流,并将该流放入 upload_blob() 方法中。 - Cindy Pau
@Andrew,您能否标记我的答案以结束这个问题?谢谢。 :) - Cindy Pau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接