mobile-more
Version:
基于 antd-mobile v5 扩展移动端 UI 组件
160 lines (150 loc) • 5.08 kB
JavaScript
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import { isFile, isObject, isString } from 'ut2';
import { getFileType } from 'util-helpers';
import IconAudio from "./images/icon-audio.png";
import IconExcel from "./images/icon-excel.png";
import IconFile from "./images/icon-file.png";
import IconPdf from "./images/icon-pdf.png";
import IconWord from "./images/icon-word.png";
import IconVideo from "./images/icon-video.png";
import { isSupportTouch } from "../../utils/dom";
/**
* 获取 url 的文件名。
*
* 如果是 `blob:xxx` 格式的 URL,则返回空字符串。
*
* @param url 文件URL
* @returns 文件名
* @example
* getUrlFileName('https://example.com/file.txt') // 'file.txt'
* getUrlFileName('https://example.com/dir/file.txt') // 'file.txt'
* getUrlFileName('blob:https://example.com/1234-5678-90ab-cdef') // ''
* getUrlFileName('xxx') // 'xxx'
* getUrlFileName('xxx.txt') // 'xxx.txt'
*/
export function getUrlFileName(url) {
if (!isString(url) || !url || url.indexOf('blob:') === 0) {
return '';
}
var divider = url.indexOf('\\') > -1 ? '\\' : '/';
var pathArr = url.split(divider);
return pathArr[pathArr.length - 1] || '';
}
/**
* 上传文件类型
*/
/**
* 文件类型
*/
/**
* 缓存原始文件对象与 Object URL 之间的映射关系
*/
var wm = new WeakMap();
/**
* 转换文件为统一的上传文件格式
* @param file - 待转换的文件,可以是 File 对象、URL 字符串或自定义文件对象
* @param createObjectUrlOnOriginFile - 是否为原始文件创建 Object URL,默认为 true
* @param uid - 自定义 uid
* @returns 标准化的上传文件对象,包含 uid、name、url、fileType 等属性
*
* 转换规则:
* - File 对象: 保留原始文件信息,并可选创建 Object URL
* - URL 字符串: 提取文件名,设置 url
* - 其他对象: 合并到结果对象
*/
export function transformUploadFile(file) {
var createObjectUrlOnOriginFile = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var uid = arguments.length > 2 ? arguments[2] : undefined;
var result = {
uid: uid || '__file_viewer' + Date.now(),
name: '',
url: '',
fileType: undefined
};
if (isFile(file)) {
result.name = file.name;
result.type = file.type;
result.size = file.size;
result.lastModified = file.lastModified;
result.originFileObj = file;
} else if (isString(file)) {
result.url = file;
result.name = getUrlFileName(file);
} else {
result = _objectSpread(_objectSpread({}, result), file);
// 支持 antd-mobile ImageUploadItem 类型 extra 中设置文件名或文件类型,因为部分URL没有文件名后缀识别不了文件类型
if (isObject(result.extra)) {
if (!result.name && result.extra.name) {
result.name = result.extra.name;
}
if (!result.type && result.extra.type) {
result.type = result.extra.type;
}
}
}
result.fileType = getFileType(result);
if (createObjectUrlOnOriginFile && result.originFileObj && !result.url) {
if (wm.has(result.originFileObj)) {
result.url = wm.get(result.originFileObj);
} else {
result.url = URL.createObjectURL(result.originFileObj);
wm.set(result.originFileObj, result.url);
}
}
return result;
}
/**
* 获取文件缩略图URL
* @param file - 文件对象
* @returns 返回文件缩略图的URL地址。如果文件有缩略图则返回缩略图URL,否则根据文件类型返回对应的图标URL
* - 图片类型:返回原始URL或blob URL
* - 音频类型:返回音频图标
* - 视频类型:返回视频图标
* - PDF类型:返回PDF图标
* - Word类型:返回Word图标
* - Excel类型:返回Excel图标
* - 其他类型:返回默认文件图标
*/
export function getFileThumbUrl(file) {
var fileObj = transformUploadFile(file, false);
if (fileObj.thumbnailUrl) {
return fileObj.thumbnailUrl;
}
switch (fileObj.fileType) {
case 'image':
return fileObj.url || (fileObj.originFileObj ? URL.createObjectURL(fileObj.originFileObj) : IconFile);
case 'audio':
return IconAudio;
case 'video':
return IconVideo;
case 'pdf':
return IconPdf;
case 'word':
return IconWord;
case 'excel':
return IconExcel;
default:
return IconFile;
}
}
/**
* 是否为有效PDF URL
* @param pdfUrl PDF URL
* @returns 是否为有效PDF URL
*/
export var isValidPdfUrl = function isValidPdfUrl(pdfUrl) {
return isSupportTouch ? (pdfUrl === null || pdfUrl === void 0 ? void 0 : pdfUrl.indexOf('https')) === 0 : !!pdfUrl;
};
/**
* 支持的文件类型
*/
export var supportedFileType = ['image', 'audio', 'video', 'pdf'];
/**
* 是否支持预览
* @param file 文件对象
* @returns 是否支持预览
*/
export function supports(file) {
var fileObj = transformUploadFile(file, false);
return !!fileObj.fileType && (fileObj.fileType === 'pdf' ? isValidPdfUrl(fileObj.url) : true) && supportedFileType.includes(fileObj.fileType);
}