Problem
In addition, the TypeScript version of UPD is included in the replies.
This line now returns a File object:
file = document.querySelector('#files > input[type="file"]').files[0]
I need to send this file in base 64 through json. To convert it to a base64 string, what should I do?
Asked by Vassily
Solution #1
Using the FileReader class, try this solution:
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
It’s important to note that.files[0] is a File type, which is a subclass of Blob. As a result, it’s compatible with FileReader. Take a look at the whole working example.
Answered by Dmitri Pavlutin
Solution #2
(async/await) is a modern ES6 way of doing things.
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:
If you’re looking for a way to catch errors,
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;
}
//...
}
Answered by Дмитрий Васильев
Solution #3
If you’re looking for a promise-based solution, check out @Dmitri’s code:
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)
);
Answered by joshua.paling
Solution #4
Based on Dmitri Pavlutin and joshua.paling’s responses, here’s an updated version that extracts the base64 content (removing the metadata at the start) and ensures proper padding.
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);
});
}
Answered by Arnaud P
Solution #5
The btoa() function in JavaScript can be used to convert data to a base64 encoded text.
<div>
<div>
<label for="filePicker">Choose or drag a file:</label><br>
<input type="file" id="filePicker">
</div>
<br>
<div>
<h1>Base64 encoded version</h1>
<textarea id="base64textarea"
placeholder="Base64 will appear here"
cols="50" rows="15"></textarea>
</div>
</div>
var handleFileSelect = function(evt) {
var files = evt.target.files;
var file = files[0];
if (files && file) {
var reader = new FileReader();
reader.onload = function(readerEvt) {
var binaryString = readerEvt.target.result;
document.getElementById("base64textarea").value = btoa(binaryString);
};
reader.readAsBinaryString(file);
}
};
if (window.File && window.FileReader && window.FileList && window.Blob) {
document.getElementById('filePicker')
.addEventListener('change', handleFileSelect, false);
} else {
alert('The File APIs are not fully supported in this browser.');
}
Answered by Pranav Maniar
Post is based on https://stackoverflow.com/questions/36280818/how-to-convert-file-to-base64-in-javascript