Загрузить запрос изображения из React - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь отправить запрос со стороны клиента (React) на сторону сервера (Express), содержащий загруженный файл изображения.

Вот пример формы, которую я создал на Сервер, который отправляет данные, которые я должен отправить с помощью React, вместо этого:

<form method="post" action="post" enctype="multipart/form-data">
  <input type="file" name="image" /><br /><br />
  <button type="submit" name="upload">Upload</button>
</form>

Это объект, отправленный отправленной формой при загрузке изображения: ссылка

Вот компонент React:

const Component = () => {
  const setImageAction = async (event) => {
    event.preventDefault();

    const data = await fetch("http://localhost:3000/upload/post", {
      method: "post",
      headers: { "Content-Type": "multipart/form-data" },
      body: JSON.stringify({

      }),
    });
    const uploadedImage = await data.json();
    if (uploadedImage) {
      console.log('Successfully uploaded image');
    } else {
      console.log('Error Found');
    }
  };

  return (
    <div className="content">
      <form onSubmit={setImageAction}>
        <input type="file" name="image" />
        <br />
        <br />
        <button type="submit" name="upload">
          Upload
        </button>
      </form>
    </div>
  );
};

Как видите, в компоненте React тело запроса пуст, так как я не понял, как получить этот объект файла ..

Спасибо заранее за вашу помощь!

EDIT

Обновлено, как показано, с той лишь разницей, что состояние сохраняется как Hook

Здесь новый компонент React Код:

const LandingPage = () => {
  const [picture, setPicture] = useState({});

  const uploadPicture = (e) => {
    setPicture({
      /* contains the preview, if you want to show the picture to the user
           you can access it with this.state.currentPicture
       */
      picturePreview: URL.createObjectURL(e.target.files[0]),
      /* this contains the file we want to send */
      pictureAsFile: e.target.files[0],
    });
  };

  const setImageAction = async (event) => {
    event.preventDefault();

    const formData = new FormData();
    formData.append("file", picture.pictureAsFile);

    console.log(picture.pictureAsFile);

    for (var key of formData.entries()) {
      console.log(key[0] + ", " + key[1]);
    }

    const data = await fetch("http://localhost:3000/upload/post", {
      method: "post",
      headers: { "Content-Type": "multipart/form-data" },
      body: formData,
    });
    const uploadedImage = await data.json();
    if (uploadedImage) {
      console.log("Successfully uploaded image");
    } else {
      console.log("Error Found");
    }
  };

  return (
    <div className="content landing">
      <form onSubmit={setImageAction}>
        <input type="file" name="image" onChange={uploadPicture} />
        <br />
        <br />
        <button type="submit" name="upload">
          Upload
        </button>
      </form>
    </div>
  );
};

И вот что я получил из этих console.logs: ссылка

Я создал фрагмент кода вcodeandbox, если вы хотите взглянуть на: https://codesandbox.io/s/heuristic-snyder-d67sn?file= / src / App. js

1 Ответ

1 голос
/ 09 мая 2020

добавьте этот метод для захвата события onChange:

добавьте 2 свойства к вашему состоянию: picturePreview и pictureAsFile

uploadPicture = (e) => {
        this.setState({
            /* contains the preview, if you want to show the picture to the user
               you can access it with this.state.currentPicture
           */
            picturePreview : URL.createObjectURL(e.target.files[0]),
            /* this contains the file we want to send */
            pictureAsFile : e.target.files[0]
        })
    };

сейчас, в вашем событии onSubmit:

setImageAction = () => {
        const formData = new FormData();
        formData.append(
            "file",
            this.state.pictureAsFile
        );
        // do your post request

    };

, конечно, не добавляйте метод uploadPicture к вашему вводу:

 <input type="file" name="image" onChange={this.uploadPicture}/>

EDIT

для отображения вашей formData:

for (var key of formData.entries()) 
{
    console.log(key[0] + ', ' + key[1])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...