Реагировать: невозможно передать файл в бэкэнд узла по реакции

Я пытаюсь отправить изображение на сервер через поле формы в React. Сначала я присваиваю состояние пусто, как это в моем классе конструктора

this.state = {
  image: "",
}

Затем я делаю функцию handleChange для графических и обычных текстовых полей.

handleChange(event) {
  const state = this.state;
  switch (event.target.name) {
    case 'image':
      state.image = event.target.files[0];
      break;
    default:
      state[event.target.name] = event.target.value;
  }
  this.setState(state);
}

В функции handleSubmit я вызываю функцию FormData и добавляю к ней изображение следующим образом

handleSubmit(event) {
  event.preventDefault();
  const { syllabus,image } = this.state;
  let formData = new FormData();
  formData.append('image', image);
  axios.post('api', { syllabus, formData })
   .then((response) => {
    console.log(response);
   });
 }

Наконец, это мое поле формы

<span className="btn btn-default btn-file file-choose">
  <input type="file" name="image" placeholder="Enter Image" onChange={this.handleChange} />
             </span>

Когда я отправляю эту форму и проверяю вкладку "Сеть" в консоли Chrome, formData кажется пустым, то есть изображение не передается. Когда я вызываю серверный маршрут с выбранным файлом, файл загружается, но я не могу добиться этого из интерфейса React, и изображение никогда не передается. Куда я иду не так?

3 ответа

Я решил это сам. Сначала я назначил состояние по умолчанию this.state={image: new File([''], ''),}

Это его функция-обработчик

handleIChange() { const inputFile = $("input#input-image")[0].files[0]; this.setState({ image: inputFile }); }

Вот как это представляется

handleSubmit(event) {
  event.preventDefault();
  const image = this.state.image;
  let formData = new FormData();
  formData.append("image", $("input#input-image")[0].files[0]);
  //console.log("image3", $("input#input-image")[0].files[0])
  //console.log("Data", formData)
  const config = {
    headers: {
      'Content-Type': 'multipart/form-data;boundary=${data._boundary}'
    }
  };
  axios.post('api', formData, config)
    .then((response) => {
      console.log(response);
      let id = response.data._id;
      this.props.history.push('route);
    });
}

Вам нужно отправить заголовок для типа контента

const config = {
        headers: { 'content-type': 'multipart/form-data' }
    }

    return axios.post('api', { syllabus, formData }, config)

В вашем HTML вы должны иметь

<form enctype="multipart/form-data">
   ...rest of your code
</form>

И если вы хотите проверить данные, попробуйте войти с помощью

for (let obj of formData.entries()) {
   console.log(`${obj[0]} => ${obj[1]}`); 
}
Другие вопросы по тегам