my-uniapp-tools
Version:
一个简洁稳定的 uni-app 开发工具库,提供剪贴板、本地存储、导航、系统信息等常用功能
170 lines (169 loc) • 5.51 kB
TypeScript
/**
* upload 模块工具函数
*
* @description
* 纯函数工具集,遵循 KISS 原则
* 不要类,不要抽象,只要简单直接的函数
*/
import { UniFile } from './types';
/**
* 根据文件名或路径提取扩展名(不带点)
*
* @example
* getExtension('photo.jpg') // => 'jpg'
* getExtension('archive.tar.gz') // => 'gz'
* getExtension('noext') // => undefined
*/
export declare function getExtension(path: string): string | undefined;
/**
* 扩展名同义词归一化(用于白名单校验)
*
* @description
* 只处理最常见的 jpg/jpeg/jpe 同义情况,统一归一为 jpg
* 只用于"比较/校验",不会修改对外展示的文件名/扩展名
*
* @example
* normalizeExtension('jpeg') // => 'jpg'
* normalizeExtension('JPG') // => 'jpg'
* normalizeExtension('.png') // => 'png'
*/
export declare function normalizeExtension(ext: string): string;
/**
* 归一化扩展名白名单
*/
export declare function normalizeExtensions(extensions: unknown): string[] | undefined;
/**
* 生成简单的文件唯一 ID
*
* @example
* createFileId(0) // => '1672531200000_0_a1b2c3d4e5f6'
*/
export declare function createFileId(index: number): string;
/**
* 判断是否为 H5 环境下的 blob URL
*
* @example
* isBlobUrl('blob:http://localhost:8080/xxx') // => true
* isBlobUrl('http://example.com/image.jpg') // => false
*/
export declare function isBlobUrl(path: string): boolean;
/**
* 安全回收对象 URL(仅在浏览器环境有效)
*
* @description
* 用于回收 `URL.createObjectURL` 创建的 `blob:` URL
* 回收失败不应影响主流程
*/
export declare function revokeObjectURLSafely(path: string): void;
/**
* 安全 JSON 解析
*
* @description
* 对上传接口的响应体进行统一解析
* 能解析为 JSON 则返回对象,否则返回原始字符串
* 不会抛错,避免解析失败影响上传主流程
*
* @example
* safeJsonParse('{"code":0}') // => {code: 0}
* safeJsonParse('plain text') // => 'plain text'
*/
export declare function safeJsonParse(raw: unknown): unknown;
/**
* 将 formData 的值序列化为字符串
*
* @description
* H5 FormData 只接受 string/Blob 等
* - string/number/boolean:使用 String()
* - object/array:默认 JSON.stringify,避免变成 `[object Object]`
* - 其他:尽量转成字符串,不抛错
*
* @example
* serializeFormDataValue(123) // => '123'
* serializeFormDataValue({a: 1}) // => '{"a":1}'
*/
export declare function serializeFormDataValue(value: unknown): string;
/**
* 将业务侧 formData 归一化为可安全发送的字符串字典
*
* @description
* 统一 H5(FormData) 与 uni.uploadFile(formData) 的行为
* 避免对象被隐式转成 `[object Object]`
*
* @example
* normalizeFormData({a: 1, b: {c: 2}}) // => {a: '1', b: '{"c":2}'}
*/
export declare function normalizeFormData(formData?: unknown): Record<string, string> | undefined;
/**
* 归一化请求头,避免 JS 侧传入非对象或非字符串值导致平台层行为漂移
*/
export declare function normalizeHeaders(headers?: unknown): Record<string, string> | undefined;
/**
* 推断当前运行平台(仅用于标记,不做强依赖逻辑)
*
* @description
* 使用条件编译消除运行时分支
*
* @returns 平台标识
*/
export declare function detectPlatform(): UniFile['platform'];
/**
* 归一化 uni.uploadFile 成功回调的状态码
*
* @description
* 部分平台/版本可能缺少 statusCode 字段
* 尝试从 errMsg 推断或返回 0(代表无法判定)
*
* @returns 归一化后的状态码(0 表示未知/不可用)
*/
export declare function normalizeUniUploadStatusCode(res: any): number;
/**
* 归一化 uni 侧选择文件失败的错误文案
*
* @description
* uni 的 errMsg 往往是英文(例如:`chooseImage:fail cancel`)
* 最小规则:
* - 取消选择 → 统一为"用户取消选择"
* - 其他错误 → 尽量保留中文;若是英文长串则给通用中文提示
*
* @example
* normalizePickFailMessage('chooseImage:fail cancel') // => '用户取消选择'
* normalizePickFailMessage('未知错误') // => '未知错误'
*/
export declare function normalizePickFailMessage(errMsg?: string): string;
/**
* 将文件大小(字节)与 MB 限制进行比较
*
* @description
* 仅当 maxMB 为 null 或 undefined 时视为不限制
* 允许显式传 0(表示不允许选择文件)
*
* @example
* validateFileSize(1024 * 1024 * 10, 5) // => {valid: false, message: '文件大小不能超过 5MB'}
* validateFileSize(1024 * 1024 * 3, 5) // => {valid: true}
*/
export declare function validateFileSize(size: number, maxMB?: number): {
valid: boolean;
message?: string;
};
/**
* 验证文件列表(大小与扩展名)
* @param files 文件列表
* @param config 校验配置
*/
export declare function validateSelectedFiles(files: UniFile[], config: {
maxSizeMB?: number;
extensions?: string[];
}): {
success: boolean;
message?: string;
};
/**
* 归一化并发数
*
* @description
* upload 的并发配置属于“控制流参数”,必须在 core 层收敛成一个确定的整数。
* 规则保持简单直观:
* - `raw` 是有限正数:向下取整后与 totalCount 取最小值(并发不应超过任务数)
* - 其他非法值:视为“默认全并发”(等于 totalCount)
*/
export declare function normalizeConcurrency(raw: unknown, totalCount: number): number;