feat: utils

This commit is contained in:
chndfang 2025-05-06 17:35:40 +08:00
parent 7081d3dfa8
commit d3f5387df9

View File

@ -0,0 +1,86 @@
/**
*
* *<a>
* @param url
* @param name
*/
export function downloadFile(url: string, name?: string): void {
if (!url) return;
const element = document.createElement('a');
element.href = url;
if (name) {
element.download = name;
}
element.click();
element.remove();
}
/**
*
* @param accept
* @param limit byte
* @returns
*/
export async function selectFile(accept?: string, limit?: number): Promise<File | void> {
const element = document.createElement('input');
element.type = 'file';
element.accept = accept ?? '';
try {
return await new Promise<File | void>((resolve, reject) => {
element.onchange = () => {
const file = element.files?.[0];
if (!file?.size) return resolve();
if (limit && limit < file.size) return reject(`文件大小不能超过${~~(limit / 1000)}KB`);
const extension = file.name.split('.').pop()!.toLowerCase();
if (accept && !accept.toLowerCase().includes(extension)) return reject(`仅支持${accept}文件`);
resolve(file);
};
element.oncancel = () => resolve();
element.click();
});
} finally {
element.onchange = null;
element.oncancel = null;
element.remove();
}
}
/**
* Base64图片转二进制
* @param base64:Base64
* @returns
*/
export function base64ToBlob(base64: string): Blob | undefined {
const [prefix, data] = base64?.split('base64,', 2) ?? [];
const type = prefix?.match(/:(.*?);/)?.[1];
const str = atob(data ?? '');
if (!type || !str?.length) return;
let n = str.length;
const buffer = new Uint8Array(n);
while (n--) {
buffer[n] = str.charCodeAt(n);
}
return new Blob([buffer], { type });
}
/**
*
* @param text
* @returns
*/
export function textToBlob(text: string): Blob | undefined {
if (!text.length) return;
return new Blob([text], { type: 'text/plain' });
}
/**
*
* @param file
* @returns
*/
export async function decodeTextFile(file: File): Promise<string | undefined> {
if (!file.size) return;
const decoder = new TextDecoder();
const buffer = await file.arrayBuffer();
return decoder.decode(buffer);
}