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?
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 .
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)
);
JavaScript btoa () la fonction peut être utilisée pour convertir des données en chaîne encodée base64
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);
});
}
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);