UNPKG

@eternalheart/ngx-file-preview

Version:

A powerful Angular file preview component library supporting multiple file formats including images, videos, PDFs, Office documents, text files and more.

147 lines 15.9 kB
export class PreviewUtils { static formatFileSize(bytes) { if (bytes === undefined || bytes === null) return '未知大小'; if (bytes === 0) return '0 B'; const units = ['B', 'KB', 'MB', 'GB', 'TB']; const k = 1024; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + units[i]; } static getFileType(file) { // 首先检查 MIME 类型 const mimeType = file.type.toLowerCase(); if (mimeType.startsWith('image/')) return 'image'; if (mimeType.startsWith('video/') || mimeType.includes('application/x-mpegURL') || mimeType.includes('application/vnd.apple.mpegurl')) return 'video'; if (mimeType.startsWith('audio/')) return 'audio'; // 检查文件扩展名 const extension = file.name.split('.').pop()?.toLowerCase(); return this.getFileTypeFromExtension(extension); } static getFileTypeFromUrl(url) { try { const extension = url.split('.').pop()?.toLowerCase(); return PreviewUtils.isBase64Url(url) ? "image" : this.getFileTypeFromExtension(extension); } catch { return 'unknown'; } } static isBase64Url(url) { return url.startsWith('data:'); } static getFileTypeFromExtension(extension) { if (!extension) return 'unknown'; switch (extension) { case 'jpg': case 'jpeg': case 'png': case 'gif': case 'bmp': case 'webp': return 'image'; case 'mp4': case 'webm': case 'ogg': case 'mov': case 'm3u8': case 'm3u': case 'ts': case 'avi': case 'wmv': case 'flv': case 'mkv': case '3gp': return 'video'; case 'mp3': case 'wav': return 'audio'; case 'pdf': return 'pdf'; case 'ppt': case 'pptx': return 'ppt'; case 'doc': case 'docx': return 'word'; case 'xls': case 'xlsx': return 'excel'; case 'txt': case 'json': return 'txt'; case 'md': return 'markdown'; case 'zip': case 'rar': case '7z': return 'zip'; default: return 'unknown'; } } /** * 转换为 PreviewFile 类型 */ static normalizeFiles(input) { // 转换为数组 const inputArray = Array.isArray(input) ? input : [input]; return inputArray.map(item => PreviewUtils.normalizeFile(item)); } static normalizeFile(input) { // 如果已经是 PreviewFile 类型,直接返回 if (PreviewUtils.isPreviewFile(input)) { return input; } // 如果是 File 对象 if (input instanceof File) { return { url: URL.createObjectURL(input), name: input.name, type: PreviewUtils.getFileType(input), size: input.size, lastModified: input.lastModified }; } // 如果是字符串 URL if (typeof input === 'string') { return { url: input, name: PreviewUtils.getFileNameFromUrl(input), type: PreviewUtils.getFileTypeFromUrl(input) }; } // 自推测类型 if (typeof input === 'object' && 'url' in input) { return { url: input.url, name: input.name, type: PreviewUtils.getFileTypeFromUrl(input.url) }; } throw new Error('Invalid file input'); } static isPreviewFile(input) { return typeof input === 'object' && 'url' in input && 'name' in input && 'type' in input; } static getFileNameFromUrl(url) { try { const urlObj = new URL(url); const pathname = urlObj.pathname; const fileName = pathname.split('/').pop(); return fileName || 'unknown'; } catch { return 'unknown'; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWZpbGUtcHJldmlldy9zcmMvbGliL3V0aWxzL3ByZXZpZXcudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLFlBQVk7SUFDdkIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFjO1FBQ2xDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQ3pELElBQUksS0FBSyxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUU5QixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDZixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBELE9BQU8sVUFBVSxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFVO1FBQzNCLGVBQWU7UUFDZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXpDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUNsRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMs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Z0JBQzFCLElBQUksRUFBRSxZQUFZLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQWEsQ0FBQzthQUMzRCxDQUFBO1FBQ0gsQ0FBQztRQUdELE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFVO1FBQzdCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUTtZQUM5QixLQUFLLElBQUksS0FBSztZQUNkLE1BQU0sSUFBSSxLQUFLO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQVc7UUFDbkMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzNDLE9BQU8sUUFBUSxJQUFJLFNBQVMsQ0FBQztRQUMvQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UHJldmlld0ZpbGUsIFByZXZpZXdGaWxlSW5wdXQsIFByZXZpZXdUeXBlfSBmcm9tICcuLi90eXBlcy9wcmV2aWV3LnR5cGVzJztcblxuZXhwb3J0IGNsYXNzIFByZXZpZXdVdGlscyB7XG4gIHN0YXRpYyBmb3JtYXRGaWxlU2l6ZShieXRlcz86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzID09PSB1bmRlZmluZWQgfHwgYnl0ZXMgPT09IG51bGwpIHJldHVybiAn5pyq55+l5aSn5bCPJztcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCJztcblxuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XG4gICAgY29uc3QgayA9IDEwMjQ7XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoMikpICsgJyAnICsgdW5pdHNbaV07XG4gIH1cblxuICBzdGF0aWMgZ2V0RmlsZVR5cGUoZmlsZTogRmlsZSk6IFByZXZpZXdUeXBlIHtcbiAgICAvLyDpppblhYjmo4Dmn6UgTUlNRSDnsbvlnotcbiAgICBjb25zdCBtaW1lVHlwZSA9IGZpbGUudHlwZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKG1pbWVUeXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSByZXR1cm4gJ2ltYWdlJztcbiAgICBpZiAobWltZVR5cGUuc3RhcnRzV2l0aCgndmlkZW8vJykgfHwgbWltZVR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL3gtbXBlZ1VSTCcpIHx8IG1pbWVUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi92bmQuYXBwbGUubXBlZ3VybCcpKSByZXR1cm4gJ3ZpZGVvJztcbiAgICBpZiAobWltZVR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJykpIHJldHVybiAnYXVkaW8nO1xuXG4gICAgLy8g5qOA5p+l5paH5Lu25omp5bGV5ZCNXG4gICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsZVR5cGVGcm9tRXh0ZW5zaW9uKGV4dGVuc2lvbik7XG4gIH1cblxuICBzdGF0aWMgZ2V0RmlsZVR5cGVGcm9tVXJsKHVybDogc3RyaW5nKTogUHJldmlld1R5cGUge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSB1cmwuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBQcmV2aWV3VXRpbHMuaXNCYXNlNjRVcmwodXJsKSA/IFwiaW1hZ2VcIiA6IHRoaXMuZ2V0RmlsZVR5cGVGcm9tRXh0ZW5zaW9uKGV4dGVuc2lvbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpc0Jhc2U2NFVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1cmwuc3RhcnRzV2l0aCgnZGF0YTonKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEZpbGVUeXBlRnJvbUV4dGVuc2lvbihleHRlbnNpb24/OiBzdHJpbmcpOiBQcmV2aWV3VHlwZSB7XG4gICAgaWYgKCFleHRlbnNpb24pIHJldHVybiAndW5rbm93bic7XG5cbiAgICBzd2l0Y2ggKGV4dGVuc2lvbikge1xuICAgICAgY2FzZSAnanBnJzpcbiAgICAgIGNhc2UgJ2pwZWcnOlxuICAgICAgY2FzZSAncG5nJzpcbiAgICAgIGNhc2UgJ2dpZic6XG4gICAgICBjYXNlICdibXAnOlxuICAgICAgY2FzZSAnd2VicCc6XG4gICAgICAgIHJldHVybiAnaW1hZ2UnO1xuICAgICAgY2FzZSAnbXA0JzpcbiAgICAgIGNhc2UgJ3dlYm0nOlxuICAgICAgY2FzZSAnb2dnJzpcbiAgICAgIGNhc2UgJ21vdic6XG4gICAgICBjYXNlICdtM3U4JzpcbiAgICAgIGNhc2UgJ20zdSc6XG4gICAgICBjYXNlICd0cyc6XG4gICAgICBjYXNlICdhdmknOlxuICAgICAgY2FzZSAnd212JzpcbiAgICAgIGNhc2UgJ2Zsdic6XG4gICAgICBjYXNlICdta3YnOlxuICAgICAgY2FzZSAnM2dwJzpcbiAgICAgICAgcmV0dXJuICd2aWRlbyc7XG4gICAgICBjYXNlICdtcDMnOlxuICAgICAgY2FzZSAnd2F2JzpcbiAgICAgICAgcmV0dXJuICdhdWRpbyc7XG4gICAgICBjYXNlICdwZGYnOlxuICAgICAgICByZXR1cm4gJ3BkZic7XG4gICAgICBjYXNlICdwcHQnOlxuICAgICAgY2FzZSAncHB0eCc6XG4gICAgICAgIHJldHVybiAncHB0JztcbiAgICAgIGNhc2UgJ2RvYyc6XG4gICAgICBjYXNlICdkb2N4JzpcbiAgICAgICAgcmV0dXJuICd3b3JkJztcbiAgICAgIGNhc2UgJ3hscyc6XG4gICAgICBjYXNlICd4bHN4JzpcbiAgICAgICAgcmV0dXJuICdleGNlbCc7XG4gICAgICBjYXNlICd0eHQnOlxuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIHJldHVybiAndHh0JztcbiAgICAgIGNhc2UgJ21kJzpcbiAgICAgICAgcmV0dXJuICdtYXJrZG93bic7XG4gICAgICBjYXNlICd6aXAnOlxuICAgICAgY2FzZSAncmFyJzpcbiAgICAgIGNhc2UgJzd6JzpcbiAgICAgICAgcmV0dXJuICd6aXAnO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDovazmjaLkuLogUHJldmlld0ZpbGUg57G75Z6LXG4gICAqL1xuICBzdGF0aWMgbm9ybWFsaXplRmlsZXMoaW5wdXQ6IFByZXZpZXdGaWxlSW5wdXQpOiBQcmV2aWV3RmlsZVtdIHtcbiAgICAvLyDovazmjaLkuLrmlbDnu4RcbiAgICBjb25zdCBpbnB1dEFycmF5ID0gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF07XG4gICAgcmV0dXJuIGlucHV0QXJyYXkubWFwKGl0ZW0gPT4gUHJldmlld1V0aWxzLm5vcm1hbGl6ZUZpbGUoaXRlbSkpO1xuICB9XG5cbiAgc3RhdGljIG5vcm1hbGl6ZUZpbGUoaW5wdXQ6IFByZXZpZXdGaWxlSW5wdXQpOiBQcmV2aWV3RmlsZSB7XG4gICAgLy8g5aaC5p6c5bey57uP5pivIFByZXZpZXdGaWxlIOexu+Wei++8jOebtOaOpei/lOWbnlxuICAgIGlmIChQcmV2aWV3VXRpbHMuaXNQcmV2aWV3RmlsZShpbnB1dCkpIHtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK8gRmlsZSDlr7nosaFcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6IFVSTC5jcmVhdGVPYmplY3RVUkwoaW5wdXQpLFxuICAgICAgICBuYW1lOiBpbnB1dC5uYW1lLFxuICAgICAgICB0eXBlOiBQcmV2aWV3VXRpbHMuZ2V0RmlsZVR5cGUoaW5wdXQpLFxuICAgICAgICBzaXplOiBpbnB1dC5zaXplLFxuICAgICAgICBsYXN0TW9kaWZpZWQ6IGlucHV0Lmxhc3RNb2RpZmllZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/lrZfnrKbkuLIgVVJMXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybDogaW5wdXQsXG4gICAgICAgIG5hbWU6IFByZXZpZXdVdGlscy5nZXRGaWxlTmFtZUZyb21VcmwoaW5wdXQpLFxuICAgICAgICB0eXBlOiBQcmV2aWV3VXRpbHMuZ2V0RmlsZVR5cGVGcm9tVXJsKGlucHV0KVxuICAgICAgfTtcbiAgICB9XG4gICAgLy8g6Ieq5o6o5rWL57G75Z6LXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgJ3VybCcgaW4gaW5wdXQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybDogaW5wdXQudXJsIGFzIHN0cmluZyxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIHR5cGU6IFByZXZpZXdVdGlscy5nZXRGaWxlVHlwZUZyb21VcmwoaW5wdXQudXJsIGFzIHN0cmluZylcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmaWxlIGlucHV0Jyk7XG4gIH1cblxuICBzdGF0aWMgaXNQcmV2aWV3RmlsZShpbnB1dDogYW55KTogaW5wdXQgaXMgUHJldmlld0ZpbGUge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmXG4gICAgICAndXJsJyBpbiBpbnB1dCAmJlxuICAgICAgJ25hbWUnIGluIGlucHV0ICYmXG4gICAgICAndHlwZScgaW4gaW5wdXQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0RmlsZU5hbWVGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuICAgICAgY29uc3QgcGF0aG5hbWUgPSB1cmxPYmoucGF0aG5hbWU7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGhuYW1lLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICByZXR1cm4gZmlsZU5hbWUgfHwgJ3Vua25vd24nO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9XG4gIH1cblxufVxuIl19