Реагировать.js, как отправить multipart / form-data на сервер

мы хотим отправить файл изображения в виде составной / формы на бэкэнд, мы пытаемся использовать html-форму, чтобы получить файл и отправить файл в виде formData, вот коды

export default class Task extends React.Component {

  uploadAction() {
    var data = new FormData();
    var imagedata = document.querySelector('input[type="file"]').files[0];
    data.append("data", imagedata);

    fetch("http://localhost:8910/taskCreationController/createStoryTask", {
      mode: 'no-cors',
      method: "POST",
      headers: {
        "Content-Type": "multipart/form-data"
        "Accept": "application/json",
        "type": "formData"
      },
      body: data
    }).then(function (res) {
      if (res.ok) {
        alert("Perfect! ");
      } else if (res.status == 401) {
        alert("Oops! ");
      }
    }, function (e) {
      alert("Error submitting form!");
    });
  }

  render() {
    return (
        <form encType="multipart/form-data" action="">
          <input type="file" name="fileName" defaultValue="fileName"></input>
          <input type="button" value="upload" onClick={this.uploadAction.bind(this)}></input>
        </form>
    )
  }
}

ошибка в backend составляет "вложенные исключением является org.springframework.сеть.составной.MultipartException: не удалось разобрать запрос многоэлементного сервлета; вложенным исключением является java.Ио.IOException: org.апаш.кот.утиль.http.fileupload с.FileUploadException: запрос был отклонен, так как не было многоэлементной границы найдено."

после прочтения этой, мы попытались установить границу для заголовков в fetch:

fetch("http://localhost:8910/taskCreationController/createStoryTask", {
      mode: 'no-cors',
      method: "POST",
      headers: {
        "Content-Type": "multipart/form-data; boundary=AaB03x" +
        "--AaB03x" +
        "Content-Disposition: file" +
        "Content-Type: png" +
        "Content-Transfer-Encoding: binary" +
        "...data... " +
        "--AaB03x--",
        "Accept": "application/json",
        "type": "formData"
      },
      body: data
    }).then(function (res) {
      if (res.ok) {
        alert("Perfect! ");
      } else if (res.status == 401) {
        alert("Oops! ");
      }
    }, function (e) {
      alert("Error submitting form!");
    });
  }

на этот раз ошибка в бэкэнде:сервлет.service () для сервлета [dispatcherServlet] в контексте с path [] бросил исключение [ошибка обработки запроса; вложенным исключением является java.ленг.NullPointerException] с основной причиной

добавим ли мы многоэлементную границу справа? Где он должен быть? Возможно, мы ошибаемся, потому что мы не получайте данные multipart / form-data. Как мы можем получить его правильно?

3 ответов


мы просто пытаемся удалить наши заголовки, и это работает!

fetch("http://localhost:8910/taskCreationController/createStoryTask", {
      mode: 'no-cors',
      method: "POST",
      body: data
    }).then(function (res) {
      if (res.ok) {
        alert("Perfect! ");
      } else if (res.status == 401) {
        alert("Oops! ");
      }
    }, function (e) {
      alert("Error submitting form!");
    });

для передачи multipart/formdata, вам нужно избегать contentType, так как браузер автоматически назначает boundary и Content-Type.

в вашем случае с помощью fetch, даже если вы избегаете Content-Type Он устанавливает значение по умолчанию text/plain. Поэтому попробуйте с jQuery ajax. который удаляет contentType если мы установим значение false.

это рабочий код

var data = new FormData();
var imagedata = document.querySelector('input[type="file"]').files[0];
data.append("data", imagedata);
$.ajax({
    method: "POST",
    url: fullUrl,
    data: data,
    dataType: 'json',
    cache: false,
    processData: false,
    contentType: false
}).done((data) => {
    //resolve(data);
}).fail((err) => {
    //console.log("errorrr for file upload", err);
    //reject(err);
});

файл также доступен в случае:

e.target.files[0]

(исключает необходимость document.querySelector('input[type="file"]').files[0];)

uploadAction() {
  const data = new FormData();
  const imagedata = e.target.files[0];
  data.append('inputname', imagedata);
  ...

Примечание: Использовать console.log(data.get('inputname')) для отладки, console.log(data) не будет отображать добавленные данные.