загрузите несколько файлов из формы react js throgh axios

#reactjs

Вопрос:

я пытаюсь загрузить несколько файлов, теперь я могу загрузить только один файл, как я могу загрузить 3 файла из разных входных файлов

 import React from "react";
import axios, { post } from "axios";
;
import moment from "moment";
import "./calendar.css";

export default class Dashboard extends React.Component {
  constructor(props) {
    super(props);
  
    this.state = {
    
    
     
      image_file: null,
      image_preview: "",
      file: null,
    };
    this.onsubmbit = this.onsubmbit.bind(this);
    this.onChange = this.onChange.bind(this);
   
  }

  changeHandler = (e) => {
    this.setState({
      allValues: { ...this.state.allValues, [e.target.name]: e.target.value },
    });
  };

  onChange(e) {
   
    console.log(e.target.files[0]);


    let image_as_files = e.target.files[0];

    this.setState({
     
      image_file: image_as_files,
    });

  }
  

  onsubmbit = (e) => {
    e.preventDefault();
    if (this.state.image_file !== null) {
      let formData = new FormData();
      formData.append("scanReport", this.state.image_file);
    

      axios
        .post(
          "url/",
          formData,
          {
            headers: {
              Authorization: `token `   localStorage.getItem("token"),
              "Content-type": "multipart/form-data",
            },
          }
        )
        .then((res) => {
          console.log(`Success`   res.data);
        })
        .catch((err) => {
          console.log(err);
        });
    }
  };


 
 

  render() {
    return (
      <>
      
          <form onSubmit={this.onsubmbit}>
            <div className="module-wrap" style={styles.module}>
             
                <h4>Upload Scan Report</h4>
                <input
                  type="file"
                  id="file"
                  name="ScanReport"
                  // accept="application/pdf"
                  onChange={this.onChange}
                  value={this.state.allValues.ScanReport}
                />
                <h4>Upload Blood Report</h4>
                <input
                  type="file"
                  name="BloodReport"
                  onChange={this.onChange}
                  value={this.state.allValues.BloodReport}
                />
                <h4>Upload Antenatal Charts</h4>
                <input
                  type="file"
                  name="AntenatalCharts"
                  onChange={this.onChange}
                  value={this.state.allValues.AntenatalCharts}
                />
                <h4>Enter Today BP</h4>
                <input
                  type="text"
                  name="bp"
                  onChange={this.changeHandler}
                  value={this.state.allValues.bp}
                />
                <h4>Enter Todays Weight</h4>
                <input
                  type="text"
                  name="Weight"
                  onChange={this.changeHandler}
                  value={this.state.allValues.Weight}
                />
              </div>

              <br />

              <div>
                <button type="submit" style={styles.sbtn}>
                  Submit
                </button>
              </div>
            </div>
          </form>
      
      </>
    );
  }
}

 

я пытаюсь загрузить несколько файлов, теперь я могу загрузить только один файл, как я могу загрузить 3 файла из разных входных файлов
я пытаюсь загрузить несколько файлов, теперь я могу загрузить только один файл, как я могу загрузить 3 файла из разных входных файлов

Комментарии:

1. Поддерживает ли сервер только тип содержимого «составные/данные формы»? Если он поддерживает тело JSON, вы можете отправить файлы в кодировке base64 в виде массива в теле JSON.

2. я не хочу, чтобы base64 let image_as_files = e.target.files[0]; использовал это, я могу установить только первый файл, как получить 2-й и третий файл и добавить эти данные формы

Ответ №1:

Если я правильно понимаю, что он уже работает для одного файла (ScanReport), поэтому все, что вам нужно сделать, это обновить свой onChange метод, чтобы знать атрибут ввода name для поддержки нескольких входных файлов. А затем соответствующим образом обновите состояние своего класса.

Таким образом, ваше состояние должно выглядеть примерно так:

 this.state = {
  allValues: {
    AppointmentDate: "",
    Date: "",
    ScanDate: "",
    question: "",
    ScanReport: "",
    BloodReport: "",
    AntenatalCharts: "",
    Weight: "",
  },
  files: {
    ScanReport: null, // <- these keys should match the 'name' of the inputs
    BloodReport: null,
    AntenatalCharts: null
  },
  image_preview: "",
  file: null,
}
 

Затем обновите свой onChange , чтобы использовать атрибут name, чтобы установить его соответствующим образом:

 onChange(e) {
  let files = this.state.files
  files[e.target.name] = e.target.files[0]

  this.setState({  
    files: files
  });
}
 

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

 let formData = new FormData();

// EDIT: added logic to handle null files
if (this.state.files.ScanReport != null) {
  formData.append("scanReport", this.state.files.ScanReport);
}
if (this.state.files.BloodReport != null) {
  formData.append("bloodReport", this.state.files.BloodReport);
}
if (this.state.files.AntenatalCharts != null) {
  formData.append("antenatalCharts", this.state.files.AntenatalCharts);
}

...

 

Комментарии:

1. спасибо за ответ, но теперь, когда я пытаюсь загрузить 1 файл за раз, я получаю ошибку

2. Добро пожаловать в мир программного обеспечения 🙂 Вам придется включить обработку ошибок, когда файлы не будут выбраны. Я обновлю свой ответ, но технически это больше не является частью одного и того же вопроса, поэтому, если вы обнаружите еще какие-либо проблемы, подумайте о создании нового вопроса.

3. Я обновил свой ответ. Если это решит ваш первоначальный вопрос о загрузке нескольких файлов, пожалуйста, не забудьте отметить принятый ответ на этот вопрос. Это помогает поддерживать Stackoverflow в чистоте и порядке 🙂