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ó:
Gracias de antemano por cualquier tipo de ayuda proporcionada.
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 objetosUploadFile
sean opcionales en FastAPI, puedes definir una lista de objetosUploadFile
opcionales utilizando la funciónList
y la funciónOptional
. Aquí tienes un ejemplo:En este ejemplo, puedes ver que estamos utilizando la función
List
para definir una lista de objetosUploadFile
, y luego envolviendo esa lista conOptional
para permitir que sea opcional en el punto final de la API. También estamos utilizando el parámetrodefault
de la funciónFile
para establecer el valor predeterminado defiles
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 buclefor
, porque es posible (pero poco probable) que el usuario suba varios archivos a la vez. Para cada archivo, estamos leyendo su contenido conawait 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.