axios 将图像从React转换到FastAPI会引发422 Unprocessable Entity错误

5q4ezhmt  于 12个月前  发布在  iOS
关注(0)|答案(1)|浏览(160)

我已经使用FastApi创建了一个API,用于处理上传的图像并返回处理后的图像。
这里是图像上传端点

@app.post("/predict")
async def root(file: UploadFile = File(...)):
..............................
res,im_png = cv2.imencode(".png", bg_img)
    return StreamingResponse(io.BytesIO(im_png.tobytes()), media_type="image/png")

字符串
我在前端做了什么:

class Detect extends Component {

  state = {
    title: '',
    content: '',
    image: null
  };

  handleChange = (e) => {
    this.setState({
      [e.target.id]: e.target.value
    })
  };

  handleImageChange = (e) => {
    this.setState({
      image: e.target.files[0]
    })
  };

  handleSubmit = (e) => {
    e.preventDefault();
    console.log(this.state);
    let form_data = new FormData();
    form_data.append('image', this.state.image, this.state.image.name);
    let url = 'http://127.0.0.1:8000/predict';
    axios.post(url, form_data, {
      headers: {
        'content-type': 'multipart/form-data'
      }
    })
        .then(res => {
          console.log(res.data);
        })
        .catch(err => console.log(err))
  };

  render() {
    return (
      <div className="App">
        <form onSubmit={this.handleSubmit}>

          <p>
            <input type="file"
                   id="image"
                   accept="image/png, image/jpeg"  onChange={this.handleImageChange} required/>
          </p>
          <input type="submit"/>
        </form>
      </div>
    );
  }
}

export default Detect;


当我通过前端上传图片并提交时,API显示**“不可处理的实体”**,而当我使用Swagger UI时,它工作正常。
我认为FastApi没有接收到图像作为可以处理的类型我如何解决这个问题??

tzdcorbm

tzdcorbm1#

您应该使用在端点中定义UplaodFile字段时使用的相同键/参数名称将图像添加到FormData对象。在您的示例中,即file,如示例所示:

@app.post("/predict")
async def root(file: UploadFile = File(...)):
    pass       ^^^^

字符串
因此,在你的前端,你应该在将图像添加到FormData对象时使用这个名称:

form_data.append('file', this.state.image, this.state.image.name);


有关详细信息,请参阅this answerthis answer

相关问题