diff --git a/frontend/src/views/host/file-management/index.vue b/frontend/src/views/host/file-management/index.vue index ed37f1f32776..5a4e583eaa67 100644 --- a/frontend/src/views/host/file-management/index.vue +++ b/frontend/src/views/host/file-management/index.vue @@ -480,7 +480,7 @@
@@ -696,7 +696,7 @@ import Convert from './convert/index.vue'; import { debounce } from 'lodash-es'; import TerminalDialog from './terminal/index.vue'; import { Dashboard } from '@/api/interface/dashboard'; -import { CompressExtension, CompressType } from '@/enums/files'; +import { CompressExtension, MimetypeByExtensionObject } from '@/enums/files'; import type { TabPaneName } from 'element-plus'; import { getComponentInfo } from '@/api/modules/host'; import { routerToNameWithQuery } from '@/utils/router'; @@ -1195,8 +1195,8 @@ const calculateSize = (path: string) => { }, 0); }; -const getIconName = (extension: string) => { - return getIcon(extension); +const getIconName = (name: string, extension: string) => { + return getIcon(getFileExtension(name, extension)); }; const openMode = (item: File.File) => { @@ -1224,17 +1224,19 @@ const openCompress = (items: File.File[]) => { }; const openDeCompress = (item: File.File) => { - if (Mimetypes.get(item.mimeType) == undefined) { + const extension = getFileExtension(item.name, item.extension); + const mimeType = item.mimeType || MimetypeByExtensionObject[extension]; + const typeByMime = mimeType ? Mimetypes.get(mimeType) : undefined; + const typeByExtension = getEnumKeyByValue(extension); + + if (typeByMime && (!typeByExtension || CompressExtension[typeByMime] === extension)) { + fileDeCompress.type = typeByMime; + } else if (typeByExtension) { + fileDeCompress.type = typeByExtension; + } else { MsgWarning(i18n.global.t('file.canNotDeCompress')); return; } - fileDeCompress.type = Mimetypes.get(item.mimeType); - if (CompressExtension[Mimetypes.get(item.mimeType)] != item.extension) { - fileDeCompress.type = getEnumKeyByValue(item.extension); - } - if (item.name.endsWith('.tar.gz') || item.name.endsWith('.tgz')) { - fileDeCompress.type = CompressType.TarGz; - } fileDeCompress.name = item.name; fileDeCompress.path = item.path; @@ -1244,11 +1246,29 @@ const openDeCompress = (item: File.File) => { }; function getEnumKeyByValue(value: string): keyof typeof CompressExtension | undefined { + const normalizedValue = value.toLowerCase(); return (Object.keys(CompressExtension) as Array).find( - (k) => CompressExtension[k] === value, + (k) => CompressExtension[k] === normalizedValue, ); } +const sortedCompressExtensions = Object.values(CompressExtension).sort((a, b) => b.length - a.length); + +const getFileExtension = (name: string, extension?: string): string => { + const lowerName = name?.toLowerCase() ?? ''; + const compoundMatch = sortedCompressExtensions.find((compressExtension) => lowerName.endsWith(compressExtension)); + if (compoundMatch) { + return compoundMatch; + } + + if (extension) { + return extension.toLowerCase(); + } + + const extensionIndex = lowerName.lastIndexOf('.'); + return extensionIndex === -1 ? '' : lowerName.slice(extensionIndex); +}; + const openView = (item: File.File) => { const fileType = getFileType(item.extension); if (fileType === 'image') { @@ -1263,14 +1283,17 @@ const openView = (item: File.File) => { return openPreview(item, fileType); } + if (fileType === 'compress') { + return openDeCompress(item); + } + const path = item.isSymlink ? item.linkPath : item.path; if (item.size > MAX_OPEN_SIZE) { return openTextPreview(path, item.name); } const actionMap = { - compress: openDeCompress, - text: () => openCodeEditor(item.path, item.extension), + text: () => openCodeEditor(path, item.extension), }; return actionMap[fileType] ? actionMap[fileType](item) : openCodeEditor(path, item.extension); @@ -1549,8 +1572,11 @@ const toFavorite = (row: File.Favorite) => { jump(row.path); } else { let file = {} as File.File; + const extension = getFileExtension(row.name); file.path = row.path; - file.extension = '.' + row.name.split('.').pop(); + file.name = row.name; + file.extension = extension; + file.mimeType = MimetypeByExtensionObject[extension] || ''; openView(file); } }; @@ -1586,7 +1612,7 @@ const beforeButtons = [ label: i18n.global.t('commons.button.open'), click: open, show: (row: File.File) => { - return row?.isDir || row?.size <= MAX_OPEN_SIZE; + return row?.isDir || row?.size <= MAX_OPEN_SIZE || isDecompressFile(row); }, }, { @@ -1596,7 +1622,7 @@ const beforeButtons = [ openTextPreview(path, row.name); }, show: (row: File.File) => { - return !row?.isDir && row?.size > MAX_OPEN_SIZE; + return !row?.isDir && row?.size > MAX_OPEN_SIZE && !isDecompressFile(row); }, }, {