您的位置:

fastapi报错ValueError(f"Expected UploadFile, received: {type(v)}")怎么办

  发布时间:2023-01-26 15:30:01
报错的原因在FastAPI 中的出现可能是因为你在请求中预期接收一个文件上传,但是实际上收到了一个其他类型的数据。示例如下这段代码中,当用户没有上传文件或者上传了非文件类型的数据时,会引发 ValueError 异常并返回错误信息解决方案是,确保在请求中上传了文件,或者检查上传数据的类型是否是 UploadFile。示例如下这个示例中,我们限制了文件上传的类型为 jpeg 和 png,并限制了文件大小不能超过 2MB,如果文件不符合条件,将会抛出相应的错误信息。

报错的原因

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,如果文件不符合条件,将会抛出相应的错误信息。

需要注意的是,这只是一个简单的示例,在实际应用中,还需要考虑更多的因素,比如文件存储,文件的安全性等。