【问题标题】:Problem with sending Image from React to Flask将图像从 React 发送到 Flask 的问题
【发布时间】:2020-08-04 15:01:01
【问题描述】:

我有以下 ReactJS+HTML 代码:

import React, { useState } from 'react';

export const sendImage = () => {
  const [image, setImage] = useState();

  const handleSubmit = (e) => {
    e.preventDefault()
    let fileToUpload = image
    const formData = new FormData()
    formData.append('file', fileToUpload)
    
    fetch('/api/upload', {
        method: 'POST',
        headers: {
          'Content-Type': 'multipart/form-data',
          'Accept': 'multipart/form-data'
        },
        body: formData
      }).then(resp => {
        resp.json().then(data => {console.log(data)})
      })
    }


  return(
    <form onSubmit={handleSubmit} className="container mt-5 pt-5 pb-5" encType="multipart/form-data">

      <div className="form-inline justify-content-center mt-5">
        <label htmlFor="image" className="ml-sm-4 font-weight-bold mr-md-4">Image : </label>
        <div className="input-group">
          <input onChange={(e) => {setImage(e.target.files[0])}} type="file" id="image" name="file" accept="image/*" className="file-custom"/>
        </div>
      </div>

      <div className="input-group justify-content-center mt-4">
        <button type="submit" className="btn btn-md btn-primary">Upload...</button>
      </div>

    </form>
  )
}

以及以下 Python-Flask 代码:

import os
from flask import Flask, request, render_template

app = Flask(__name__)


@app.route('/api/upload', methods=['POST'])
def handle_form():
    files = request.files
    file = files.get('file')
    """
      CODE TO HANDLE FILE
    """
    return jsonify({
        'success': True,
        'file': 'Received'
    })


@app.route("/")
def index():
    return render_template("index.html");   


if __name__ == "__main__":
    app.run(port=8080, debug=True)

问题是当我提交表单时,文件没有发送到后端。

Python-Flask 打印文件和文件时响应:

ImmutableMultiDict([])
None

如何解决此问题?

请注意:

当我使用纯 HTML(非基于 React 的表单)时效果很好,但是当使用基于 React 的表单时它不起作用。

【问题讨论】:

  • 对不起,如果这是一个愚蠢的问题,但是您是否尝试过向同一个 URL 提交一个正常的、非基于 React 的表单?只是为了确保出错的是 python 方面,而不是 React。
  • 是的,当我使用基于非 React 的表单时,一切正常,但我想使用基于 React 的表单。

标签: javascript python html reactjs flask


【解决方案1】:

我个人会过渡到以不同的方式提交表单。考虑这样做:

<form onSubmit={handleSubmit} className="container mt-5 pt-5 pb-5" enctype="multipart/form-data">
    <div className="form-inline justify-content-center mt-5">
        <label htmlFor="image" className="ml-sm-4 font-weight-bold mr-md-4">Image :  </label>
        <div className="input-group">
            <input type="file" id="image" name="file" 
            accept="image/*" className="file-custom"/>
        </div>
    </div>

    <div className="input-group justify-content-center mt-4">
        <button type="submit" className="btn btn-md btn-primary">Upload,,,</button>
    </div>
</form>
const handleSubmit = (e) => {
    e.preventDefault()
    const formData = new FormData(e.target);
    
    const Upload = async() => {
      await fetch('/api/upload', {
        method: 'POST',
        body: formData
      }).then(resp => {
        resp.json().then(data => {console.log(data)})
      })
    }
    Upload();
  }

这样,您实际上仍在使用浏览器默认的表单系统,而无需重新发明任何轮子,但它仍然在 react 中并由发布请求处理

我在 Google 上搜索了如何使用 fetch api 提交 formData,一篇文章建议不要使用 Content-Type 标头,因此我将其删除。

或者,考虑使用axios

          axios
            .post('/api/upload', formData)

【讨论】:

  • 谢谢,我更改了我的 handleSubmit 函数以匹配你的并删除了 Content-Type 和 Accept,它运行良好。
  • 酷,你不用换axios吗?有趣。
  • 我实际上做了一个小测试项目,看看我是否可以发送你最初做的 formData,控制 React 代码中的 image 状态 - 它成功了!我基本上做了和你一样的事情,从头开始创建一个全新的formData 并将文件附加到它。最终可能只是标题对您来说是错误的。
  • 你能把代码贴在你使用这种方法的地方吗?我会很感激的。
  • 我使用的反应代码在这里,jsfiddle.net/qszxdyeh
猜你喜欢
  • 2023-01-05
  • 2020-11-08
  • 2022-09-23
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2021-02-06
  • 1970-01-01
相关资源
最近更新 更多