簡體   English   中英

將圖像從流上傳到 Blob 存儲(在 Python 中)

[英]Upload an image to Blob Storage from a stream (in Python)

我需要將 Python 生成的圖像上傳到 Azure Blob 存儲而不將其保存在本地。 此時我生成一個圖像,將其保存在本地並將其上傳到存儲(見下面的代碼),但我需要為大量圖像運行它,並且需要它不依賴於本地存儲。

我嘗試以流(特別是字節流)的形式保存它,因為上傳似乎也在使用流(對不起,如果這是一種幼稚的方法,我在 Python 方面沒有那么有經驗)但我不知道如何在上傳過程中使用它。 如果我像打開本地文件一樣使用它,它會上傳一個空文件。

我正在使用 azure-storage-blob 版本 12.2.0。 我注意到在以前版本的 azure-storage-blob 中有可能從流上傳(特別是 BlockBlobService.get_blob_to_stream),但我在這個版本中找不到它,並且由於某些依賴關系我無法降級包。

非常感謝任何幫助。

import matplotlib.pyplot as plt
import numpy as np
from io import BytesIO
from azure.storage.blob import ContainerClient

# create some mock data
t = np.arange(0.01, 10.0, 0.01)
data1 = np.sin(2 * np.pi * t)

# plot it
fig, ax1 = plt.subplots()
ax1.set_xlabel('time (s)')
ax1.set_ylabel('exp')
ax1.plot(t, data1)

# save it locally
plt.savefig("example.png")

# create a blob client and upload the file
container_client = ContainerClient.from_container_url(container_SASconnection_string)
blob_client = container_client.get_blob_client(blob = "example.png")

with open("example.png") as data:
    blob_client.upload_blob(data, blob_type="BlockBlob")


# ALTERNATIVELY, instead of saving locally save it as an image stream
fig, ax1 = plt.subplots()
ax1.set_xlabel('time (s)')
ax1.set_ylabel('exp')
ax1.plot(t, data1)

image_stream = BytesIO()
plt.savefig(image_stream)

# but this does not work (it uploads an empty file)
# blob_client.upload_blob(image_stream, blob_type="BlockBlob")

您必須執行的操作將流的位置重置為0 ,然后您可以將其直接上傳到 blob 存儲,而無需先將其保存到本地文件。

這是我寫的代碼:

import matplotlib.pyplot as plt
import numpy as np
from io import BytesIO
from azure.storage.blob import ContainerClient

# create some mock data
t = np.arange(0.01, 10.0, 0.01)
data1 = np.sin(2 * np.pi * t)

# plot it
fig, ax1 = plt.subplots()
ax1.set_xlabel('time (s)')
ax1.set_ylabel('exp')
ax1.plot(t, data1)

image_stream = BytesIO()
plt.savefig(image_stream)
# reset stream's position to 0
image_stream.seek(0)

# upload in blob storage
container_client = ContainerClient.from_container_url(container_SASconnection_string)
blob_client = container_client.get_blob_client(blob = "example.png")
blob_client.upload_blob(image_stream.read(), blob_type="BlockBlob") 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM