使用Streamlit file_uploader上传PDF至FastAPI报422错误求助
解决Streamlit上传PDF到FastAPI返回422错误的思路
问题根源
FastAPI的UploadFile和File依赖要求请求必须是multipart/form-data格式,而你当前的requests请求用普通payload传递参数,默认是application/x-www-form-urlencoded编码,无法被FastAPI正确解析,所以返回422错误。
具体修改方案
调整客户端的requests请求方式,分别用data传递普通字段,files传递文件,让请求自动以multipart/form-data格式发送:
uploaded_pdf = st.file_uploader('Upload a file', type="pdf") url = "http://localhost:8000/file/upload" if st.button("Upload PDF"): # 构造文件参数:键名要和FastAPI接口的uploaded_file参数一致 files = { "uploaded_file": (uploaded_pdf.name, uploaded_pdf, "application/pdf") } # 普通表单字段用data传递 data = {"username": username} response = requests.post(url, data=data, files=files) st.write(response) st.write(response.json()) # 可选:查看接口返回的详细信息
为什么之前的方法无效
- 直接传
uploaded_pdf.getvalue():把文件二进制内容放到普通表单字段里,FastAPI无法识别为UploadFile类型。 - 直接传
uploaded_pdf对象:requests无法正确序列化Streamlit的UploadedFile对象,导致请求格式不符合要求。
验证逻辑
FastAPI的docs页面测试能成功,是因为它自动生成了multipart/form-data格式的请求,和上面修改后的请求格式一致,所以接口能正常处理。
内容的提问来源于stack exchange,提问作者Sanjay
相关产品推荐
相关产品推荐

