UPD TypeScript 版本也可在答案中找到
现在我通过这一行获取 File 对象:
file = document.querySelector('#files > input[type="file"]').files[0]
我需要通过 json 在 base64 中发送这个文件。我应该怎么做才能将它转换为 base64 字符串?
UPD TypeScript 版本也可在答案中找到
现在我通过这一行获取 File 对象:
file = document.querySelector('#files > input[type="file"]').files[0]
我需要通过 json 在 base64 中发送这个文件。我应该怎么做才能将它转换为 base64 字符串?
尝试使用FileReader
类的解决方案:
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
请注意,这.files[0]
是一个File
类型,它是 的子类Blob
。因此它可以与FileReader
.
请参阅完整的工作示例。
现代 ES6 方式(异步/等待)
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();
更新:
如果你想捕捉错误
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;
}
//...
}
如果您使用的是基于 Promise 的解决方案,那么@Dmitri 的代码适用于此:
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)
);
基于 Dmitri Pavlutin 和 joshua.paling 的答案,这里有一个扩展版本,它提取 base64 内容(删除开头的元数据)并确保正确完成填充。
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);
});
}
JavaScript btoa()函数可用于将数据转换为 base64 编码的字符串
<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.');
}