ReactJS获取POST文件到Flask后台(不会发送数据)。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReactJS获取POST文件到Flask后台(不会发送数据)。相关的知识,希望对你有一定的参考价值。

我已经阅读了很多关于fetch和ReactJS的文档,但我根本找不到我的代码的问题,情况是我可以选择并在状态中存储所需的文件,但当我发送提交时,Flask并没有收到文件,只有这个消息。

127.0.0.1 - - [08May2020 18:50:44] "POST upload HTTP1.1" 200 -

这是我的ReactJS代码。

import React from 'react';

class Main extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            file: null,
            brand: null
        };

        this.handleFile = this.handleFile.bind(this);
        this.handleBrand = this.handleBrand.bind(this);
        this.handleUpload = this.handleUpload.bind(this);
    }

    handleBrand(e) {
        let brand = e.target.value
        this.setState({brand: brand});
      }

    handleFile(e){

        let file = e.target.files

        this.setState({file: file})
        console.log(file)

    }

    handleUpload(e){
        e.preventDefault();

        const data = new FormData();
        data.append('file', this.state.file);
        console.log(this.state.file)

        fetch('http://localhost:5000/upload', {
            method: 'POST',
            body: data,
        })

    }

    render() {
        return (
            <form onSubmit={this.handleUpload}>
                <div>
                    <input onChange={this.handleFile} id="fileToUpload" type="file" name="filesToUpload" id="filesToUpload"/>
                </div>

                <div>
                    <select value={this.state.value} onChange={this.handleBrand}>
                    <option value="">- Please select -</option>
                        <option value="toyota">Toyota</option>
                        <option value="quick_lanes">Quick Lanes</option>
                        <option value="volvo">Volvo</option>
                        <option value="alfa_romeo">Alfa Romeo</option>
                    </select>
                </div>

                <br />
                <div>
                    <button>Upload</button>
                </div>

            </form>
        );
    }
}

export default Main;

这是我的Flask代码。

from flask import *
from flask_cors import *
import os

app = Flask(__name__)
CORS(app)

UPLOAD_FOLDER = "C:/projects/poi_dealers/files"
app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER

@app.route("/upload", methods=["GET", "POST"])
def upload_image():

    if request.method == "POST":

        if request.files:

            filesToUpload = request.files["file"]

            filesToUpload.save(os.path.join(app.config["UPLOAD_FOLDER"], filesToUpload.filename))

            print(filesToUpload)

            return redirect(request.url)


    return "All ok"

if __name__ == "__main__":
    app.secret_key = os.urandom(24)
    app.run(debug=True, host="0.0.0.0", use_reloader=False)

是这样的,我在网上找到了这段代码,它能用!我不明白为什么,我已经从头到尾看了一遍,但我看不出有什么不同,我不想用这段代码,我想知道发生了什么,有什么建议吗?这是我找到的代码。

import React from 'react';

class Main extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            imageURL: '',
        };

        this.handleUploadImage = this.handleUploadImage.bind(this);
    }

    handleUploadImage(ev) {
        ev.preventDefault();

        const data = new FormData();
        data.append('file', this.uploadInput.files[0]);
        data.append('filename', this.fileName.value);

        fetch('http://localhost:5000/upload', {
            method: 'POST',
            body: data,
        }).then((response) => {
            response.json().then((body) => {
                this.setState({ imageURL: `http://localhost:5000/${body.file}` });
            });
        });
    }

    render() {
        return (
            <form onSubmit={this.handleUploadImage}>
                <div>
                    <input ref={(ref) => { this.uploadInput = ref; }} type="file" />
                </div>
                <div>
                    <input ref={(ref) => { this.fileName = ref; }} type="text" placeholder="Enter the desired name of file" />
                </div>
                <br />
                <div>
                    <button>Upload</button>
                </div>
                <img src={this.state.imageURL} alt="img" />
            </form>
        );
    }
}

export default Main;

这是Python终端的输出 (当然,它保存的文件是正确的,'competitive_process.py'是测试用的文件名)。

<FileStorage: 'competitive_process.py' ('text/plain')>
127.0.0.1 - - [08/May/2020 18:39:09] "POST /upload HTTP/1.1" 302 -
127.0.0.1 - - [08/May/2020 18:39:09] "GET /upload HTTP/1.1" 200 -

PS: 幸运的是没有CORS错误,我检查了三遍。

尊敬的朋友们!我已经看了很多关于fetch和ReactJS的文档,我根本找不到我的代码的问题,情况是我可以选择并在状态下存储所需的文件,但当我...

答案

我没有在任何地方看到你在构造函数中为你的文件输入创建ref。

你是否在某个构造函数中创建了这个?

this.uploadInput = React.createRef();

另外,你在哪里声明initializing(初始化)?this.uploadInput? 我是不是漏了什么地方?

以上是关于ReactJS获取POST文件到Flask后台(不会发送数据)。的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Flask 和 Bootstrap-Vue 表单文件输入从 POST 请求中获取文件

将 POST ReactJs 获取到 Controller .Net Core

通过 POST 从 React 获取数据到 Flask [重复]

我可以在后台线程中处理对 Flask 服务器的 POST 请求吗?

ReactJS:用一个按钮执行POST & GET请求。

flask后端 获取不到form表单post 的文件