Subiendo una imagen construida a partir de un arreglo de bytes a Azure sin guardar localmente.
Tengo una función que toma un arreglo de bytes como argumento, utiliza bytesIO y lo construye en una imagen, y luego lo sube al almacenamiento de blob de Azure.
Debería lucir así:
def foo(b):
img = Image.open(io.BytesIO(b))
container_client = ContainerClient.from_conenction_string(connection_string, container_name)
blob_client = container_client.get_blob_client('fileUpload')
blob_client.upload(img)
Pero obtengo el error seek() takes 2 positional arguments but 3 were given
.
Encontré este hilo (https://stackoverflow.com/questions/60704712/upload-an-image-to-blob-storage-from-a-stream-in-python), pero no pude hacer que funcionara para mí.
Rastreo completo del error:
Traceback (most recent call last):
File "c:\WaitingRoom\uploadingfiles\form_recog.py", line 48, in <module>
blob_client.upload_blob(img)
File "C:\Users\355149\AppData\Local\Programs\Python\Python39\lib\site-packages\azure\core\tracing\decorator.py", line 83, in wrapper<em>use</em>tracer
return func(*args, **kwargs)
File "C:\Users\355149\AppData\Local\Programs\Python\Python39\lib\site-packages\azure\storage\blob_blob<em>client.py", line 706, in upload</em>blob
options = self._upload_blob_options(
File "C:\Users\355149\AppData\Local\Programs\Python\Python39\lib\site-packages\azure\storage\blob_blob<em>client.py", line 361, in _upload</em>blob_options
length = get_length(data)
File "C:\Users\355149\AppData\Local\Programs\Python\Python39\lib\site-packages\azure\storage\blob_shared\request<em>handlers.py", line 87, in get</em>length
data.seek(0, SEEK_END)
TypeError: seek() takes 2 positional arguments but 3 were given
davy.ai
El error está siendo causado por la función
get_length
en el SDK de Azure Blob, que está llamando al métodoseek()
en el objetodata
con dos argumentos posicionales. Sin embargo, en Python 3, la llamada aseek
requiere un tercer parámetro, el argumentowhence
, para indicar el punto de referencia para la operación de búsqueda. Para solucionar este error, necesitamos modificar el objetobytesIO
para que admita el tercer argumento en Python 3. Esto se puede hacer agregandoos.SEEK_SET
como el tercer argumento al construir el objetoBytesIO
de la siguiente manera:Aquí, estamos pasando el atributo
_file
del objetoBytesIO
al métodoupload_blob
, lo cual nos permite pasar el parámetrolength
para indicar el tamaño de los datos a subir. El métodogetbuffer().nbytes
se utiliza para obtener el tamaño en bytes del objetoBytesIO
.Con estos cambios, el error dado debería resolverse y la función debería poder subir la imagen al almacenamiento de blobs de Azure.