fastapi报错ValueError(f"Expected UploadFile, received: {type(v)}")怎么办
报错的原因
ValueError(f"Expected UploadFile, received: {type(v)}) 在FastAPI 中的出现可能是因为你在请求中预期接收一个文件上传,但是实际上收到了一个其他类型的数据。
这个错误通常是由于使用了FastAPI提供的文件上传相关的装饰器,如 @Form(...), @UploadFile, 但是实际上没有上传文件,或者上传了非文件类型的数据。
示例如下:
from fastapi import FastAPI, Form, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def create_upload_file(file
: UploadFile = File(...)):
if not isinstance(file, UploadFile):
raise ValueError(f"Expected UploadFile, received: {type(file)}")
# do something with the file
return {"filename": file.filename}
这段代码中,当用户没有上传文件或者上传了非文件类型的数据时,会引发 ValueError 异常并返回错误信息 "Expected UploadFile, received: {type(file)}"。
解决方案是,确保在请求中上传了文件,或者检查上传数据的类型是否是 UploadFile。
需要注意的是,在使用文件上传相关的装饰器时,需要确保上传了文件,如果没有上传文件或上传了非文件类型的数据,就会出现上述的错误。
如何解决
解决这个问题的方法有两种:
1. 确保请求中上传了文件,在客户端或者浏览器中检查文件是否已经被选中并上传。
2. 在服务端进行类型检查,在接收到文件之前检查上传数据的类型是否是 UploadFile。
示例如下:
from fastapi import FastAPI, Form, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
if not isinstance(file, UploadFile):
raise ValueError(f"Expected UploadFile, received: {type(file)}")
# do something with the file
return {"filename": file.filename}
这样的话,如果用户没有上传文件或上传了非文件类型的数据,就会抛出 ValueError 异常,并返回错误信息 "Expected UploadFile, received: {type(file)}"。
需要注意的是,在使用文件上传相关的装饰器时,需要确保上传了文件,如果没有上传文件或上传了非文件类型的数据,就会出现上述的错误。
另外,可以在接收文件之前对文件进行校验,比如校验文件大小,文件类型等,这样可以有效避免接收无效文件的情况。
总之,在出现 ValueError(f"Expected UploadFile, received: {type(v)}") 的情况下,解决方案是确保请求中上传了文件或者检查上传数据的类型是否是 UploadFile。
需要注意的是,在使用文件上传相关的装饰器时,需要确保上传了文件,如果没有上传文件或上传了非文件类型的数据,就会出现上述的错误。
使用例子
上面已经给出了一个例子, 在这个例子中,当用户没有上传文件或者上传了非文件类型的数据时,会引发 ValueError 异常并返回错误信息 "Expected UploadFile, received: {type(file)}"。
如果需要进行更多的文件上传校验,可以在这个基础上进行添加。如限制文件大小,限制文件类型等。
示例如下:
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
if not isinstance(file, UploadFile):
raise ValueError(f"Expected UploadFile, received: {type(file)}")
if file.content_type not
in ["image/jpeg", "image/png"]:
raise ValueError(f"Invalid file type, received: {file.content_type}")
if file.size > 2 * 1024 * 1024:
raise ValueError(f"File too large, received: {file.size} bytes")
# do something with the file
return {"filename": file.filename}
这个示例中,我们限制了文件上传的类型为 jpeg 和 png,并限制了文件大小不能超过 2MB,如果文件不符合条件,将会抛出相应的错误信息。
需要注意的是,这只是一个简单的示例,在实际应用中,还需要考虑更多的因素,比如文件存储,文件的安全性等。