Загрузить изображение в хранилище BLOB-объектов из потока (в Python) - PullRequest
1 голос
/ 16 марта 2020

Мне нужно загрузить изображение, созданное из 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")

1 Ответ

0 голосов
/ 16 марта 2020

Что нужно сделать, сбросьте позицию потока на 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") 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...