Réponses:
Méthode ES6 moderne (async / attente)
const toBase64 = file => new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
async function Main() {
const file = document.querySelector('#myfile').files[0];
console.log(await toBase64(file));
}
Main();
UPD:
Si vous voulez attraper des erreurs
async function Main() {
const file = document.querySelector('#myfile').files[0];
const result = await toBase64(file).catch(e => Error(e));
if(result instanceof Error) {
console.log('Error: ', result.message);
return;
}
//...
}
Essayez la solution en utilisant la 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
Notez qu'il .files[0]
s'agit d'un File
type, qui est une sous-catégorie de Blob
. Ainsi, il peut être utilisé avec FileReader
.
Voir l' exemple de travail complet .
return reader.result
la getBase64()
fonction (plutôt que d'utiliser console.log(reader.result)
) parce que je veux capturer la base64 en tant que variable (puis l'envoyer à Google Apps Script). J'ai appelé la fonction avec: var my_file_as_base64 = getBase64(file)
puis j'ai essayé d'imprimer sur console avec console.log(my_file_as_base64 )
et je viens de l'obtenir undefined
. Comment puis-je attribuer correctement la base64 à une variable?
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)
);
En s'appuyant sur les réponses de Dmitri Pavlutin et joshua.paling, voici une version étendue qui extrait le contenu base64 (supprime les métadonnées au début) et assure également le remplissage correct .
function getBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
let encoded = reader.result.toString().replace(/^data:(.*,)?/, '');
if ((encoded.length % 4) > 0) {
encoded += '='.repeat(4 - (encoded.length % 4));
}
resolve(encoded);
};
reader.onerror = error => reject(error);
});
}
resolve(reader.result.replace(/^.*,/, ''));
. Puisque le coma ,
est en dehors de l'alphabet base64, nous pouvons dépouiller tout ce qui se présente jusqu'au coma inclus. stackoverflow.com/a/13195218/1935128
data:
, sans aucune virgule, donc je vais garder cette première partie telle quelle. J'ai mis à jour la réponse en conséquence.
La fonction JavaScript btoa () peut être utilisée pour convertir des données en chaîne encodée en base64
Voici quelques fonctions que j'ai écrites pour obtenir un fichier au format json qui peut être facilement transmis:
//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);
onInputChange(evt) {
var tgt = evt.target || window.event.srcElement,
files = tgt.files;
if (FileReader && files && files.length) {
var fr = new FileReader();
fr.onload = function () {
var base64 = fr.result;
debugger;
}
fr.readAsDataURL(files[0]);
}
}
await
utilisez une fonction qui renvoie une promesse rejetée, vous n'obtiendrez pas d'erreur renvoyée par l'appel; il sera lancé et vous devrez l'attraper.