JS 中 File、blob、base64 之间的相互转换
FileToBlob
function FileToBlob(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.addEventListener('load', (evt) => {
const isObj = typeof evt.target.result === 'object';
const blob = isObj ? new Blob([evt.target.result]) : evt.target.result;
resolve(blob);
});
reader.addEventListener('error', reject);
reader.readAsArrayBuffer(file);
});
}
FileToBase64
function FileToBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.addEventListener('load', (evt) => resolve(evt.target.result));
reader.addEventListener('error', reject);
reader.readAsDataURL(file);
});
}
BlobToFile
function BlobToFile(blob, fileName, mimeType) {
return new File([blob], fileName, { type: mimeType});
}
BlobToBase64
function BlobToBase64(blob) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.addEventListener('load', (evt) => resolve(evt.target.result));
reader.addEventListener('error', reject);
reader.readAsDataURL(blob);
});
}
Base64ToFile
function Base64ToFile(base64, fileName, mimeType) {
const arr = base64.split(',');
const defaultMimeType = arr[0].match(/:(.*?);/)[1];
const suffix = defaultMimeType.split('/')[1];
const binary = atob(arr[1]);
const array = [];
for (let i = 0; i < binary.length; i += 1) {
array.push(binary.charCodeAt(i));
}
return new File(
[new Uint8Array(array)],
fileName || `${new Date().getTime()}.${suffix}`,
{ type: mimeType || defaultMimeType },
);
}
Base64ToBlob
function Base64ToBlob(base64, mimeType) {
const arr = base64.split(',');
const defaultMimeType = arr[0].match(/:(.*?);/)[1];
const binary = atob(arr[1]);
const array = [];
for (let i = 0; i < binary.length; i += 1) {
array.push(binary.charCodeAt(i));
}
return new Blob([new Uint8Array(array)], { type: mimeType || defaultMimeType });
}
Uint8ArrayToBase64
function Uint8ToBase64(u8Arr, type = 'image/png') {
const CHUNK_SIZE = 0x8000;
const length = u8Arr.length;
let index = 0;
let result = '';
let slice;
while (index < length) {
slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length));
result += String.fromCharCode.apply(null, slice);
index += CHUNK_SIZE;
}
return 'data:' + type.toLowerCase() + ';base64, ' + btoa(result);
}