UNPKG

mobile-more

Version:

基于 antd-mobile v5 扩展移动端 UI 组件

170 lines (160 loc) 5.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.getFileThumbUrl = getFileThumbUrl; exports.getUrlFileName = getUrlFileName; exports.supportedFileType = exports.isValidPdfUrl = void 0; exports.supports = supports; exports.transformUploadFile = transformUploadFile; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _ut = require("ut2"); var _utilHelpers = require("util-helpers"); var _iconAudio = _interopRequireDefault(require("./images/icon-audio.png")); var _iconExcel = _interopRequireDefault(require("./images/icon-excel.png")); var _iconFile = _interopRequireDefault(require("./images/icon-file.png")); var _iconPdf = _interopRequireDefault(require("./images/icon-pdf.png")); var _iconWord = _interopRequireDefault(require("./images/icon-word.png")); var _iconVideo = _interopRequireDefault(require("./images/icon-video.png")); var _dom = require("../../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' */ function getUrlFileName(url) { if (!(0, _ut.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 * - 其他对象: 合并到结果对象 */ 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 ((0, _ut.isFile)(file)) { result.name = file.name; result.type = file.type; result.size = file.size; result.lastModified = file.lastModified; result.originFileObj = file; } else if ((0, _ut.isString)(file)) { result.url = file; result.name = getUrlFileName(file); } else { result = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, result), file); // 支持 antd-mobile ImageUploadItem 类型 extra 中设置文件名或文件类型,因为部分URL没有文件名后缀识别不了文件类型 if ((0, _ut.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 = (0, _utilHelpers.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图标 * - 其他类型:返回默认文件图标 */ 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.default); case 'audio': return _iconAudio.default; case 'video': return _iconVideo.default; case 'pdf': return _iconPdf.default; case 'word': return _iconWord.default; case 'excel': return _iconExcel.default; default: return _iconFile.default; } } /** * 是否为有效PDF URL * @param pdfUrl PDF URL * @returns 是否为有效PDF URL */ var isValidPdfUrl = exports.isValidPdfUrl = function isValidPdfUrl(pdfUrl) { return _dom.isSupportTouch ? (pdfUrl === null || pdfUrl === void 0 ? void 0 : pdfUrl.indexOf('https')) === 0 : !!pdfUrl; }; /** * 支持的文件类型 */ var supportedFileType = exports.supportedFileType = ['image', 'audio', 'video', 'pdf']; /** * 是否支持预览 * @param file 文件对象 * @returns 是否支持预览 */ function supports(file) { var fileObj = transformUploadFile(file, false); return !!fileObj.fileType && (fileObj.fileType === 'pdf' ? isValidPdfUrl(fileObj.url) : true) && supportedFileType.includes(fileObj.fileType); }