es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error está siendo causado por la función get_length en el SDK de Azure Blob, que está llamando al método seek() en el objeto data con dos argumentos posicionales. Sin embargo, en Python 3, la llamada a seek requiere un tercer parámetro, el argumento whence, para indicar el punto de referencia para la operación de búsqueda. Para solucionar este error, necesitamos modificar el objeto bytesIO para que admita el tercer argumento en Python 3. Esto se puede hacer agregando os.SEEK_SET como el tercer argumento al construir el objeto BytesIO de la siguiente manera:

    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_blob(img._file, length=img.getbuffer().nbytes)
    

    Aquí, estamos pasando el atributo _file del objeto BytesIO al método upload_blob, lo cual nos permite pasar el parámetro length para indicar el tamaño de los datos a subir. El método getbuffer().nbytes se utiliza para obtener el tamaño en bytes del objeto BytesIO.

    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.

Comments are closed.