@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
JavaScript
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