vue-select-avatar-base
Version:
基于vue选择头像的包
83 lines (73 loc) • 1.57 kB
text/typescript
import { ImageFormat } from './type';
/**
* 后缀名映射
*/
export const extMap: Record<ImageFormat, string> = {
jpg: 'image/jpeg',
png: 'image/png',
webp: 'image/webp',
};
/**
* File 转 base64
*/
export function fileToBase64(file: File): Promise<string> {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result as string);
reader.onerror = reject;
});
}
// 可以选择的图片类型
const accept = [
'jpg',
'jpeg',
'png',
'svg',
'svgz',
'webp',
'ico',
'xbm',
'tif',
'jfif',
'tiff',
'bmp',
'pjp',
'apng',
'pjpeg',
'avif',
];
/**
* 选择图片
*/
export function selectImage(component?: any) {
return new Promise<File | undefined>((resolve) => {
const input = document.createElement('input');
input.type = 'file';
input.accept = accept.map((v) => '.' + v).join(',');
input.onchange = () => {
const files = input.files;
if (files && files.length > 0) {
if (component) {
// 传入了组件实例直接注入数据
component?.inject(files[0]);
}
resolve(files[0]);
} else {
resolve(void 0);
}
input.remove();
};
input.click();
});
}
// 匹配数字
const numberRegExp = /^[0-9]$/;
/**
* 格式化 css 长度
*/
export function formatCSSLength(value: string | number) {
if (typeof value === 'number') return value + 'px';
if (numberRegExp.test(value)) return value + 'px';
return value;
}