如何从反应提交多部分/表单数据到表达?

Posted

技术标签:

【中文标题】如何从反应提交多部分/表单数据到表达?【英文标题】:How to submit multipart/form-data from react to express? 【发布时间】:2020-04-06 20:16:20 【问题描述】:

我正在尝试提交带有 ImageName 类别的表单。但是在我的 ExpressJS(后端)中,我无法获取数据。在快递中,我使用express-fileupload 包。下面是我的代码,请帮我解决这个问题。

前端(React - CategoryForm.js)

import axios from "axios";
import React,  Component  from "react";

class CategoryForm extends Component 

    constructor(props) 
        super(props);
        this.state =  name: '', file: '', fileName: '' ;

        this.onChange = this.onChange.bind(this);
        this.onChangeImageHandler = this.onChangeImageHandler.bind(this);
        this.onCreate = this.onCreate.bind(this);
    

    /** Methods */
    onChange = e => this.setState( [e.target.name]: e.target.value );
    onChangeImageHandler = e => this.setState( fileName: e.target.files[0].name, file: e.target.files[0] );
    onCreate = async e => 
        e.preventDefault();
        e.stopPropagation();

        const formData = new FormData();
        formData.append('name', this.state.name);
        formData.append('file', this.state.file);

        const url = 'http://localhost:4000/api/v2/categories';
        const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVkZTc3MDM0NTgxM2QyN2NmZDExMWE3ZSIsImVtYWlsIjoiaGFyc2hhQHNrcmVlbS5pbyIsImlhdCI6MTU3NTQ0ODc1OSwiZXhwIjoxNTc2MzEyNzU5fQ.7wxCmPhkzb0aaB4q9PBKmHAj1Klw1NQmp1nBI3NsRRI';

        axios(
            method: 'POST',
            url: url,
            headers: 
                Authorization: `Bearer $token`,
                ContentType: 'multipart/form-data'
            ,
            body: formData
        )
        .then(res => this.setState( name: '', file: '', fileName: '' ))
        .catch(err => console.log('Error - ', err));
    

    /** Rendering the Template */
    render() 

        const  name, fileName  = this.state;

        return (
                <form onSubmit=this.onCreate>
                    <input type="text" name="name" value=name onChange=this.onChange placeholder="New Category Name" />
                    <input type="file" name="file" onChange=this.onChangeImageHandler />
                    <button type="submit">Add Category</button>
                </form>
        )
    


export default CategoryForm;

后端(ExpressJS : server.js)

const express = require("express");
const bodyParser = require("body-parser");
const fileUpload = require("express-fileupload");

app.use(fileUpload());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: true ));

app.use('/api/v2/categories',
        (req, res, next) =>  console.log(req.body); ,
        require("./categoryRoute"));

req.body 我得到 。请告诉我如何发送带有文本数据的图片来表达

注意:如果我只从反应中传递数据(不是图像),比如说data: name: 'Shivam',那么我将在后端获取它。

【问题讨论】:

【参考方案1】:

反应: 将您的媒体文件转换为 base64 字符串。

快递Js: 在 express 中将 base64 转换为图像(img,pdf,xlxs,etc...)

    var base64Data = req.body.file_data // base64 string
    var file_name='123.png';
    var file_dir = "assets/client_folios/"
    var fs = require("fs");
    if (!fs.existsSync('assets/'))
      fs.mkdirSync('assets/');
    
    if (!fs.existsSync(file_dir))
       fs.mkdirSync(file_dir);
    
    var file_path="assets/client_folios/"+file_name

     var file_path="assets/client_folios/"+file_name
    fs.writeFile(file_path, base64Data, 'base64',async function(err) 

    

【讨论】:

非常感谢分享代码。我将尝试在我的项目中实施。如果我遇到任何困难,我会回复你。

以上是关于如何从反应提交多部分/表单数据到表达?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 提交多部分表单数据

从 multipart/form-data 接收带有 servicestack 的文件

如何将多部分/表单数据从 android 发送到 Web 服务器?

多部分表单直接提交到 URL

在进行后突变之前反应如何验证表单

验证失败后,servlet中止多部分表单数据提交