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.

En FastAPI – No se puede hacer que múltiples UploadFile sean opcionales.

Estoy intentando hacer que UploadFile sea opcional en FastAPI, en el proceso, logro hacer que un solo archivo sea opcional, pero obtengo un error si lo convierto en múltiples archivos.


<h1>Haciendo opcional para una sola carga de archivo</h1> <p>@app.post("/archivo-opcional") async def archivoOpcional(file: Optional[UploadFile] = File(None)): if not file: print("no hay archivo") return "no hay archivo" print(file.filename) return {"nombre": file.filename}</p> <h1>Haciendo opcional para múltiples cargas de archivo</h1> <p>@app.post("/archivos-opcionales") async def archivosOpcionales(files: Optional[List[UploadFile]] = File(None)): if not files: print("no hay archivos") return "no hay archivos" print(file[0].filename) return {"nombre": file[0].filename}

y estoy obteniendo este error como resultado.

json
{"detalle":[{"loc":["cuerpo","archivos",0],"msg":"Se esperaba UploadFile, se recibió: ","tipo":"valor_error"}]}

Gracias de antemano por cualquier tipo de ayuda proporcionada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error que estás recibiendo sugiere que estás pasando una cadena en lugar de una instancia de UploadFile. Para hacer que múltiples objetos UploadFile sean opcionales en FastAPI, puedes definir una lista de objetos UploadFile opcionales utilizando la función List y la función Optional. Aquí tienes un ejemplo:

    from typing import Optional, List
    from fastapi import FastAPI, File, UploadFile
    
    app = FastAPI()
    
    @app.post("/upload")
    async def upload_files(files: Optional[List[UploadFile]] = File(default=[])):
        if not files:
            print("No se subieron archivos.")
            return {"message": "No se subieron archivos."}
    
        for file in files:
            contents = await file.read()
            print(f"El archivo {file.filename} tiene el siguiente contenido: {contents}")
    
        return {"message": f"{len(files)} archivos subidos exitosamente."}
    

    En este ejemplo, puedes ver que estamos utilizando la función List para definir una lista de objetos UploadFile, y luego envolviendo esa lista con Optional para permitir que sea opcional en el punto final de la API. También estamos utilizando el parámetro default de la función File para establecer el valor predeterminado de files como una lista vacía. Esto nos permite verificar más tarde si se ha subido o no un archivo.

    Ten en cuenta que estamos iterando sobre files con un bucle for, porque es posible (pero poco probable) que el usuario suba varios archivos a la vez. Para cada archivo, estamos leyendo su contenido con await file.read() y luego imprimiendo el nombre de archivo y su contenido.

    Con este ejemplo, deberías poder crear un punto final de la API que acepte varios objetos UploadFile y que también sean opcionales.

Comments are closed.