如何在React.js中发送带有图像的multipart/form-data?

9

我正在尝试使用React表单将表单发送到我的Express.js后端。它只发送文本而不是文件。当通过表单发送文件时,是否需要构建一个FormData?以下是我在App.js上的表格。

    class App extends Component {
     constructor(props) {
      super(props);
       this.state={
        inputTopValue:'',
        inputBottomValue:'',
        inputImageValue: '',
            }
    this.handleTopChange = this.handleTopChange.bind(this);
    this.handleBottomChange = this.handleBottomChange.bind(this);
    this.handleImageChange = this.handleImageChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
             }

    handleTopChange(event) {
       this.setState({inputTopValue: event.target.value});
               }

   handleBottomChange(event) {
    this.setState({inputBottomValue: event.target.value});
             }

   handleImageChange(event) {
    this.setState({inputImageValue: event.target.value
              }

   handleSubmit(event) {
    event.preventDefault();
    fetch('api/learning', {
        method: 'POST',
        headers: {
          'Content-Type': 'multipart/form-data',
          'Accept': 'application/json'
        },
         body: JSON.stringify({
             topstuff: event.target.topstuff.value,
             bottomstuff: event.target.bottomstuff.value,
             pic1: event.target.myimage.value

         })
    })
  }

   render() {
       return (
         <div className="App">
           <form onSubmit={this.handleSubmit} id="myform" encType="multipart/form-data">
              <input type="text" name="topstuff" placeholder="title" onChange={this.handleTopChange} value={this.state.inputTopValue} /> <br/>
              <input type="text" name="bottomstuff" placeholder="body" onChange={this.handleBottomChange} value={this.state.inputBottomValue} /><br/>
              <input type="file" name="myimage" onChange={this.handleImageChange} value={this.state.inputImageValue} /><br/>
              <input type="submit" value="yeah boy" />
           </form>
       </div>
       );
     }
   }

 export default App;

请指导我如何构建一个FormData,如果需要构建的话,并且我是否仍然需要将其字符串化。
1个回答

9
您正在错误地获取图像,您需要使用 files 而不是 value,像这样:
this.setState({inputImageValue: event.target.files[0]})

然后构建FormData:

let formData = new FormData();
formData.append('pic1', event.target.myimage.files[0]);
formData.append('topstuff', event.target.topstuff.value);
formData.append('bottomstuff', event.target.bottomstuff.value);

最后,删除JSON.stringify,因为你不需要它,并将其替换为上面的formData

顺便说一下:由于您直接通过DOM引用表单的值而不是通过状态引用,您可能要考虑:

  • 彻底摆脱状态
  • 或开始使用状态并开始通过状态引用表单的值

嗨,谢谢。在这里,第一个参数myimage应该代表存储图像的数据库列?我的数据库列名为pic1。你使用myimage有什么原因吗?formData.append('myimage', event.target.myimage.files[0]); - craftdeer
1
我在这里使用了 myimage,因为这是您在表单中使用的名称,没有其他原因,所以您可以将其更改为任何您喜欢的名称。但无论您将其更改为什么,都必须使用该名称来引用它。 - linasmnew
我需要头文件吗? - craftdeer
1
它们没有也可以正常工作,但最好的做法是仍然指定它们,所以我会把它们留在那里。 - linasmnew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接