No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Utilizando las clases File y UploadFile

9/25
Recursos

Aportes 9

Preguntas 1

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Tambien puedes probar subiendo multiples archivos de la siguiente manera:

@router.post(
    path='/post-image'
)
def post_image(
    images: List[UploadFile] = File(...)
):
    info_images = [{
        "filename": image.filename,
        "Format": image.content_type,
        "Size(kb)": round(len(image.file.read())/1024, ndigits=2)
    } for image in images]

    return info_images

Podr谩s seguir todos mis apuntes escritos en Notion en:
https://rain-scabiosa-74f.notion.site/Curso-de-FastAPI-Avanzado-189668eeee1a45168e46c5be56312967

Si te gusta dejame un corazoncito 鈾

Archivos

Request Files - FastAPI

Entrada de datos que se refiere a los archivos FastAPI, por ejemplo una imagen o un video, se utilizan dos clases File y UploadFile

UploadFile

Esta clase tiene una serie de parametros, se refiere a la clase donde se guardar谩 el archivo

  • filename: se refiere al nombre del archivo, con esto tenemos el control sobre el nombre del archivo que suba el cliente a la aplicaci贸n
  • content_type: formato del archivo por ejemplo JPEG, MP4, GIF鈥
  • file: se refiere al archivo en si mismo, los bytes del mismo

File

Hereda de Form y funciona similar a las clases Query, Path y Body, se encarga de guardar los bytes del archivo.

Ventajas de usar UploadFile en lugar de solo File o Bytes

  • El archivo se guardar谩 en la memoria hasta que supere un tama帽o m谩ximo, al pasar ese l铆mite se guardara en el disco, esto quiere decir que funciona mucho mejor con archivos grandes sin consumir toda la memoria RAM
  • Puedes obtener metadata del archivo
  • funciona como un file-like async聽interface.
  • Usa metodo Asincronos como write, read, seek y close

C贸digo de Ejemplo

@app.post(path='/post-image',)
def post_image(
    image: UploadFile = File(...)
):
    return {
        'filename': image.filename,
        'format': image.content_type,
        'size(kb)': round(len(image.file.read()) / 1024, 2)
    }

En caso de querer subir varios archivos

@router.post(
    path='/post-image'
)
def post_image(
    images: List[UploadFile] = File(...)
):
    info_images = [{
        "filename": image.filename,
        "Format": image.content_type,
        "Size(kb)": round(len(image.file.read())/1024, ndigits=2)
    } for image in images]

    return info_images

FastAPI utiliza dos clases para trabajar con archivos: una (UploadFile) para definir el tipo de la variable o par谩metro y otra (File) para definir el valor que va a contener esa variable o par谩metro.
_
Con image.file se accede al archivo propiamente dicho.

Con image.filename se obtiene el nombre del archivo.

Con image.content_type se obtiene el formato del archivo.

Con len(image.file.read()) se obtiene el tama帽o del archivo.
_

@app.post(
    path='/post-image'
)
def post_image(
    image: UploadFile = File(...)
):
    return {
        'Filename': image.filename,
        'Format': image.content_type,
        'Size(kb)': round(len(image.file.read())/1024, ndigits=2)
    }

Uffff este contenido tiene mucho poder! Me estoy inclinando mucho por el backend gracias a esta saga

Quisiera aclarar algo que suele ser confuso, la diferencia entre KB y kb.
KB hace referencia a kilo Bytes, mientras que kb es kilo bits.

Cabe mencionar que 1 byte contiene 8 bits.

  • La gran parte del tiempo se suele hacer referencia a los bytes sin embargo por si alguien no lo conoc铆a o no recordaba ah铆 va el dato 馃挌

kB *

para pdoer poner el formato en la respuesta es muy util hacer concatenacion con el texto 鈥渕b鈥 pero dada la naturaleza de python hay primero que convertir el numero en string

@app.post(path="/post-image", status_code=status.HTTP_201_CREATED)
def post_image(image: UploadFile = File(...)):
    return {
        "Filename": image.filename,
        "Format": image.content_type,
        "Size": str(round(len(image.file.read()) / 1024, ndigits=2)) + " mb",
    }

ufff brutal profe muchas gracias

Super