更新: TypeScript 版本也可以在回答中找到。
现在我通过这行代码获取文件对象:
file = document.querySelector('#files > input[type="file"]').files[0]
我需要通过 JSON 以 base64 的形式发送该文件。请问如何将其转换为 base64 字符串?
更新: TypeScript 版本也可以在回答中找到。
现在我通过这行代码获取文件对象:
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 方式(async/await)
const toBase64 = file => new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = reject;
});
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];
try {
const result = await toBase64(file);
return result
} catch(error) {
console.error(error);
return;
}
//...
}
await
一个返回拒绝(rejected)Promise的函数,你将不会得到一个通过调用返回的错误(Error),它会被抛出,你需要捕获它。 - Dancrumb<input type="file" accept="image/png, image/jpeg">
- Дмитрий Васильев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);
});
}
resolve(reader.result.replace(/^.*,/, ''));
。由于逗号,
不在base64字母表内,因此我们可以将包括逗号在内的所有内容都删除掉。https://dev59.com/Y2Ys5IYBdhLWcg3wBvf7#13195218 - Johnridejs
,所以没有编译器会干扰你关于类型的问题。然而,在我的 ts
代码中,我在 .replace(...)
前面添加了 .toString()
。不确定是否真正必要,但为了保险起见,我会更新我的答案。谢谢。 - Arnaud PTypeScript版本
const file2Base64 = (file:File):Promise<string> => {
return new Promise<string> ((resolve,reject)=> {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result?.toString() || '');
reader.onerror = error => reject(error);
})
}
reader.onload = () => resolve(reader.result ? reader.result.toString() : '')
- Rahul Ravindranreader.onload = () => resolve(reader.result?.toString() || '');
- Oleksandr DanylchenkoJavaScript 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.');
}
这里是我编写的几个函数,可以将文件以json格式获取,以便于传递和处理:
//takes an array of JavaScript File objects
function getFiles(files) {
return Promise.all(files.map(getFile));
}
//take a single JavaScript File object
function getFile(file) {
const 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,
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);
const fileInput = document.querySelector('input');
fileInput.addEventListener('change', (e) => {
// get a reference to the file
const file = e.target.files[0];
// encode the file using the FileReader API
const reader = new FileReader();
reader.onloadend = () => {
// use a regex to remove data url part
const base64String = reader.result
.replace('data:', '')
.replace(/^.+,/, '');
// log to console
// logs wL2dvYWwgbW9yZ...
console.log(base64String);
};
reader.readAsDataURL(file);});
function uploadImage(e) {
var file = e.target.files[0];
let reader = new FileReader();
reader.onload = (e) => {
let image = e.target.result;
console.log(image);
};
reader.readAsDataURL(file);
}
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]);
}
}
getBase64()
函数中使用return reader.result
(而不是console.log(reader.result)
),因为我想将base64作为变量捕获(然后发送到Google Apps Script)。 我使用以下代码调用函数:var my_file_as_base64 = getBase64(file)
,然后尝试用console.log(my_file_as_base64 )
打印到控制台,但只得到了undefined
。 如何正确地将base64分配给变量? - user1063287