mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 01:57:19 +08:00
feat: 支持解压单独的 .gz 格式文件 (#1318)
* Initial plan * feat: 支持解压 .gz 格式文件(如 .sql.gz)和优化压缩格式选项 Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com> * fix: 修正压缩格式注释说明 Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com> * fix: lint --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com> Co-authored-by: 耗子 <haozi@loli.email>
This commit is contained in:
@@ -13,6 +13,7 @@ type FormatArchive string
|
||||
|
||||
const (
|
||||
Zip FormatArchive = "zip"
|
||||
Gz FormatArchive = "gz"
|
||||
Bz2 FormatArchive = "bz2"
|
||||
Tar FormatArchive = "tar"
|
||||
TGz FormatArchive = "tgz"
|
||||
@@ -75,6 +76,11 @@ func UnCompress(src string, dst string) error {
|
||||
switch format {
|
||||
case Zip:
|
||||
_, err = shell.Execf("unzip -qo '%s' -d '%s'", src, dst)
|
||||
case Gz:
|
||||
// 单独的 gzip 文件(如 .sql.gz),解压到目标目录
|
||||
// gunzip -k 保留原文件,-c 输出到标准输出,重定向到目标文件
|
||||
baseName := strings.TrimSuffix(filepath.Base(src), ".gz")
|
||||
_, err = shell.Execf("gunzip -c '%s' > '%s'", src, filepath.Join(dst, baseName))
|
||||
case TGz:
|
||||
_, err = shell.Execf("tar -xzf '%s' -C '%s'", src, dst)
|
||||
case Bz2:
|
||||
@@ -103,6 +109,10 @@ func ListCompress(src string) ([]string, error) {
|
||||
switch format {
|
||||
case Zip:
|
||||
out, err = shell.Execf("unzip -Z1 '%s'", src)
|
||||
case Gz:
|
||||
// 单独的 gzip 文件只包含一个文件,返回去除 .gz 后缀的文件名
|
||||
baseName := strings.TrimSuffix(filepath.Base(src), ".gz")
|
||||
return []string{baseName}, nil
|
||||
case TGz, Bz2, Tar, Xz:
|
||||
out, err = shell.Execf("tar -tf '%s'", src)
|
||||
case SevenZip:
|
||||
@@ -123,16 +133,20 @@ func formatArchiveByPath(path string) (FormatArchive, error) {
|
||||
case ".zip":
|
||||
return Zip, nil
|
||||
case ".bz2":
|
||||
// .bz2 后缀的文件使用 tar -xjf 解压,适用于 .tar.bz2 格式
|
||||
return Bz2, nil
|
||||
case ".tar":
|
||||
return Tar, nil
|
||||
case ".tgz":
|
||||
return TGz, nil
|
||||
case ".gz":
|
||||
// 支持 .tar.gz 和单独的 .gz 格式(如 .sql.gz)
|
||||
if strings.HasSuffix(path, ".tar.gz") {
|
||||
return TGz, nil
|
||||
}
|
||||
return Gz, nil
|
||||
case ".xz":
|
||||
// .xz 后缀的文件使用 tar -xJf 解压,适用于 .tar.xz 格式
|
||||
return Xz, nil
|
||||
case ".7z":
|
||||
return SevenZip, nil
|
||||
|
||||
@@ -89,12 +89,12 @@ onMounted(() => {
|
||||
v-model:value="format"
|
||||
:options="[
|
||||
{ label: '.zip', value: '.zip' },
|
||||
{ label: '.bz2', value: '.bz2' },
|
||||
{ label: '.tar', value: '.tar' },
|
||||
{ label: '.gz', value: '.gz' },
|
||||
{ label: '.tar', value: '.tar' },
|
||||
{ label: '.tar.gz', value: '.tar.gz' },
|
||||
{ label: '.tgz', value: '.tgz' },
|
||||
{ label: '.xz', value: '.xz' },
|
||||
{ label: '.tar.bz2', value: '.tar.bz2' },
|
||||
{ label: '.tar.xz', value: '.tar.xz' },
|
||||
{ label: '.7z', value: '.7z' }
|
||||
]"
|
||||
@update:value="ensureExtension"
|
||||
|
||||
Reference in New Issue
Block a user