Comment convertir fichier en base64 en JavaScript?

maintenant j'obtiens L'objet de dossier par cette ligne:

file = document.querySelector('#files > input[type="file"]').files[0]

je dois envoyer ce fichier via json en base 64. Que dois-je faire pour le convertir en chaîne base64?

73
demandé sur Insane Skull 2016-03-29 12:49:26

5 réponses

essayer la solution en utilisant le FileReader classe :

function getBase64(file) {
   var reader = new FileReader();
   reader.readAsDataURL(file);
   reader.onload = function () {
     console.log(reader.result);
   };
   reader.onerror = function (error) {
     console.log('Error: ', error);
   };
}

var file = document.querySelector('#files > input[type="file"]').files[0];
getBase64(file); // prints the base64 string

noter que .files[0] est un File type, qui est une sous-classe de Blob . Il peut donc être utilisé avec FileReader .

Voir le exemple .

178
répondu Dmitri Pavlutin 2016-03-29 10:17:13

si vous recherchez une solution basée sur la promesse, voici le code de @Dmitri adapté pour cela:

function getBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
  });
}

var file = document.querySelector('#files > input[type="file"]').files[0];
getBase64(file).then(
  data => console.log(data)
);
44
répondu joshua.paling 2018-04-03 10:18:49

JavaScript btoa () la fonction peut être utilisée pour convertir des données en chaîne encodée base64

6
répondu Pranav Maniar 2016-03-29 09:53:15

construit sur Dmitri Pavlutin et joshua.réponse de paling, voici une version étendue qui extrait le contenu de base64 (supprime les métadonnées au début) et assure également que padding est fait correctement .

function getBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => {
      let encoded = reader.result.replace(/^data:(.*;base64,)?/, '');
      if ((encoded.length % 4) > 0) {
        encoded += '='.repeat(4 - (encoded.length % 4));
      }
      resolve(encoded);
    };
    reader.onerror = error => reject(error);
  });
}
3
répondu Arnaud P 2018-10-11 08:42:30

voici quelques fonctions que j'ai écrites pour obtenir un fichier dans un format json qui peut être transmis facilement:

    //takes an array of JavaScript File objects
    function getFiles(files) {
        return Promise.all(files.map(file => getFile(file)));
    }

    //take a single JavaScript File object
    function getFile(file) {
        var reader = new FileReader();
        return new Promise((resolve, reject) => {
            reader.onerror = () => { reader.abort(); reject(new Error("Error parsing file"));}
            reader.onload = function () {

                //This will result in an array that will be recognized by C#.NET WebApi as a byte[]
                let bytes = Array.from(new Uint8Array(this.result));

                //if you want the base64encoded file you would use the below line:
                let base64StringFile = btoa(bytes.map((item) => String.fromCharCode(item)).join(""));

                //Resolve the promise with your custom file structure
                resolve({ 
                    bytes: bytes,
                    base64StringFile: base64StringFile,
                    fileName: file.name, 
                    fileType: file.type
                });
            }
            reader.readAsArrayBuffer(file);
        });
    }

    //using the functions with your file:

    file = document.querySelector('#files > input[type="file"]').files[0]
    getFile(file).then((customJsonFile) => {
         //customJsonFile is your newly constructed file.
         console.log(customJsonFile);
    });

    //if you are in an environment where async/await is supported

    files = document.querySelector('#files > input[type="file"]').files
    let customJsonFiles = await getFiles(files);
    //customJsonFiles is an array of your custom files
    console.log(customJsonFiles);
0
répondu tkd_aj 2018-07-26 16:51:47