ReactJS: Как обработать загрузку изображений / файлов с помощью Formik? - PullRequest
2 голосов
/ 15 мая 2019

Я создаю страницу профиля для моего сайта, используя ReactJS.Теперь мой вопрос: как мне загрузить изображение с локального компьютера и сохранить его в базе данных, а также отобразить его на странице профиля

import React, {Component} from 'react';
import { connect } from 'react-redux';
import { AccountAction } from '../../actions/user/AccountPg1Action';
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';

class AccountInfo extends Component {
  constructor(props) {
    super(props) 
    this.state = {
      currentStep: 1,
      userAccountData: {
        userid: '',
        useravtar: '',
        attachement_id: '',
   }
  }
 }

handleFileUpload = (event) => {
  this.setState({useravtar: event.currentTarget.files[0]})
};

handleChange = event => {
    const {name, value} = event.target
    this.setState({
      [name]: value
    })    
  }

handleSubmit = event => {
    let that = this;
    const { AccountAction } = that.props;
    event.preventDefault();

    let accountInputs = {
      userid: 49,
      useravtar: that.state.image,
      attachement_id: 478,
}
    that.setState({
      userAccountData: accountInputs,
    })

    AccountAction(accountInputs)
  }
AccountInfoView = () => {
console.log(this.state.useravtar)
    return (
      <section id="account_sec" className="second_form">
      <div className="container">
      <React.Fragment>
        <Formik
          initialValues={‌{
            file: null,
            email: '',
            phone: ''
          }}
          validationSchema={accountInfoSchema}
          render={(values) => {
          return(
        <Form onSubmit={this.handleSubmit}>
        <Step1 
          currentStep={this.state.currentStep} 
          handleChange={this.handleChange}
          file= {this.state.useravtar}
          handleFileUpload={this.handleFileUpload}
          />
          </Form>
        );
      }}
      />
      </React.Fragment>
      )
  }

  render() {    

    return (
      <div>{this.authView()}</div>
    )
  }
}

function Step1(props) {
console.log(props.useravtar)
  if (props.currentStep !== 1) {
    return null
  } 

  return(
    <div className="upload">
        <label htmlFor="profile">
          <div className="imgbox">
            <img src="images/trans_116X116.png" alt="" />
            <img src={props.useravtar} className="absoImg" alt="" />
          </div>
        </label>
<input id="file" name="file" type="file" accept="image/*" onChange={props.handleFileUpload}/>
        <span className="guide_leb">Add your avatar</span>
      </div>
  )
}

Когда я выполняю консоль в handleChange action для event.target.файл [0] отвечает неопределенным.

Кроме того, выполняя действие console.log(this.state.useravtar) in handleSubmit, он показывает путь, например c:/fakepath/imgname.jpg

PS: у меня есть несколько форм, поэтому я использую его в Step,И я использую Redux Reducer для хранения данных.

Я ссылался на эту ссылку, но мое требование не похоже на это.

1 Ответ

1 голос
/ 16 мая 2019

Formik не поддерживает загрузку файлов по умолчанию, но вы можете попробовать следующее

<input id="file" name="file" type="file" onChange={(event) => {
  setFieldValue("file", event.currentTarget.files[0]);
}} />

Здесь "file" представляет ключ, который вы используете для хранения файла

И при отправке вы можете получить имя файла, размер и т. Д. Для файла, используя

onSubmit={(values) => {
        console.log({ 
              fileName: values.file.name, 
              type: values.file.type,
              size: `${values.file.size} bytes`
            })

Если вы хотите установить файл в состояние компонентов, вы можете использовать

onChange={(event) => {
  this.setState({"file": event.currentTarget.files[0]})};
}}

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

В AccountInfo добавить функцию для обработки загрузки файлов

handleFileUpload = (event) => {
this.setState({WAHTEVETKEYYOUNEED: event.currentTarget.files[0]})};
}

И передать ту же функцию компоненту Step1, как показано ниже

    <Step1 
      currentStep={this.state.currentStep} 
      handleChange={this.handleChange}
      file= {this.state.image}
      handleFileUpload={this.handleFileUpload}
      />

В Step1 Component, куда вы загружаете файл, измените ввод как

<input id="file" name="file" type="file" accept="image/*" onChange={props.handleFileUpload}/>

Если вам необходимо предварительно просмотреть загруженное изображение, то вы можете создать BLOB-объект и передать его в качестве источника для изображения, как показано ниже

<img src={URL.createObjectURL(FILE_OBJECT)} /> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...