J'ai un enregistrement pour dans React où je dois télécharger des fichiers sur le serveur. Ces fichiers doivent être encodés en Base64.
La fonction pour l'encoder est la suivante:
getBase64(file) {
let document = "";
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function () {
document = reader.result;
};
reader.onerror = function (error) {
console.log('Error: ', error);
};
return document;
}
Et la fonction pour gérer le clic sur le bouton suivant du formulaire est la suivante:
handleNextButtonClick(event){
event.preventDefault();
let data = {domainId: this.props.user[0].domainId, name: steps.stepThree, values: this.state.files};
let idCard = this.state.files.filter(file => file.file_type === "ID_CARD")[0].values.file;
let statuses = this.state.files.filter(file => file.file_type === "STATUTES")[0].values.file;
let blankLetterHead = this.state.files.filter(file => file.file_type === "LETTER_HEAD")[0].values.file;
let companyPhoto = this.state.files.filter(file => file.file_type === "COMPANY_PICTURE")[0].values.file;
let idCardBase64 = this.getBase64(idCard);
let statusesBase64 = this.getBase64(statuses);
let blankLetterHeadBase64 = this.getBase64(blankLetterHead);
let companyPhotoBase64 = this.getBase64(companyPhoto);
}
Si je console le journal par exemple le premier this.state.files.filter(file => file.file_type === "ID_CARD")[0].values.file;
j'obtiens
Tout semble correct, mais je reçois une erreur:
Uncaught TypeError: Failed to execute 'readAsDataURL' on 'FileReader': parameter 1 is not of type 'Blob'.
Aucune idée sur la façon de résoudre ça?
[~ # ~] mise à jour [~ # ~]
let idCardBase64 = idCard ? this.getBase64(idCard) : "";
let statusesBase64 = statuses ? this.getBase64(statuses) : "";
let blankLetterHeadBase64 = blankLetterHead ? this.getBase64(blankLetterHead) : "";
let companyPhotoBase64 = companyPhoto ? this.getBase64(companyPhoto) : "";
Je l'ai changé. Et dans ce cas n'existe que idCard
. Maintenant, je ne reçois aucune erreur mais idCardBase64
Est ""
Et n'est pas encodé en Base64.
la lecture des fichiers est asynchrone. utilisez donc le rappel ou promettez de résoudre votre problème.
let idCardBase64 = '';
this.getBase64(idCard, (result) => {
idCardBase64 = result;
});
et utilisez le rappel pour renvoyer les données que vous obtenez.
getBase64(file, cb) {
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function () {
cb(reader.result)
};
reader.onerror = function (error) {
console.log('Error: ', error);
};
}
En outre, vous pouvez utiliser ce composant React React File Base64
Vérifiez la démo