87 votes

Comment configurer le multipart dans axios avec react ?

Lorsque je boucle quelque chose, cela fonctionne bien :

curl -L -i -H 'x-device-id: abc' -F "url=http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"  http://example.com/upload

Comment faire pour que cela fonctionne correctement avec axios ? J'utilise react si cela compte :

uploadURL (url) {
  return axios.post({
    url: 'http://example.com/upload',
    data: {
      url: url
    },
    headers: {
      'x-device-id': 'stuff',
      'Content-Type': 'multipart/form-data'
    }
  })
  .then((response) => response.data)
}

Cela ne fonctionne pas pour une raison quelconque.

0 votes

Quelle est l'erreur exacte ici ? Obtenez-vous un code de réponse spécifique du serveur ? La publication des journaux d'événements de Fiddler pourrait également être utile.

144voto

Ashik Nesin Points 478

Voici comment je fais le téléchargement de fichiers dans react en utilisant axios.

import React from 'react'
import axios, { post } from 'axios';

class SimpleReactFileUpload extends React.Component {

  constructor(props) {
    super(props);
    this.state ={
      file:null
    }
    this.onFormSubmit = this.onFormSubmit.bind(this)
    this.onChange = this.onChange.bind(this)
    this.fileUpload = this.fileUpload.bind(this)
  }

  onFormSubmit(e){
    e.preventDefault() // Stop form submit
    this.fileUpload(this.state.file).then((response)=>{
      console.log(response.data);
    })
  }

  onChange(e) {
    this.setState({file:e.target.files[0]})
  }

  fileUpload(file){
    const url = 'http://example.com/file-upload';
    const formData = new FormData();
    formData.append('file',file)
    const config = {
        headers: {
            'content-type': 'multipart/form-data'
        }
    }
    return  post(url, formData,config)
  }

  render() {
    return (
      <form onSubmit={this.onFormSubmit}>
        <h1>File Upload</h1>
        <input type="file" onChange={this.onChange} />
        <button type="submit">Upload</button>
      </form>
   )
  }
}

export default SimpleReactFileUpload

Source :

3 votes

Comment envoyer plusieurs fichiers dans ce cas ?

3 votes

Pourquoi devez-vous préciser multipart/form-data ? Il devrait être déjà intégré dans FormData . Source( github.com/axios/axios/issues/318#issuecomment-218948420 )

0 votes

Vous pouvez passer l'élément de formulaire en tant qu'argument lors de l'instanciation d'un fichier FormData ce qui est très utile car il remplit l'objet avec les clés du formulaire et leurs valeurs.

12voto

Shota Points 2760

Si vous envoyez des données alphanumériques, essayez de modifier

'Content-Type': 'multipart/form-data'

à

'Content-Type': 'application/x-www-form-urlencoded'

Si vous envoyez des données non alphanumériques, essayez de supprimer complètement le paramètre "Content-Type".

Si cela ne fonctionne toujours pas, essayez demande-promesse (au moins pour tester si c'est vraiment un problème d'axios ou pas)

1 votes

Qu'entendez-vous par données alphanumériques ?

3voto

SHREYA PRASAD Points 11

Ok. J'ai essayé les deux méthodes ci-dessus mais ça n'a pas marché pour moi. Après des essais et des erreurs, je me suis rendu compte que le fichier n'était pas sauvegardé dans la variable 'this.state.file'.

fileUpload = (e) => {
    let data = e.target.files
    if(e.target.files[0]!=null){
        this.props.UserAction.fileUpload(data[0], this.fallBackMethod)
    }
}

ici fileUpload est un fichier js différent qui accepte deux paramètres comme ceci

export default (file , callback) => {
const formData = new FormData();
formData.append('fileUpload', file);

return dispatch => {
    axios.put(BaseUrl.RestUrl + "ur/url", formData)
        .then(response => {
            callback(response.data);
        }).catch(error => {
         console.log("*****  "+error)
    });
}

}

n'oubliez pas de lier la méthode dans le constructeur. Faites-moi savoir si vous avez besoin de plus d'aide à ce sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X