From 526f192200ab5a053aaa3e7a412140a879c70765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Thu, 31 Oct 2024 18:20:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=96=87=E4=BB=B6):=20=E8=A7=A3=E5=8E=8B?= =?UTF-8?q?=E6=97=B6=E5=8F=AA=E8=AE=BE=E7=BD=AE=E5=8E=8B=E7=BC=A9=E5=8C=85?= =?UTF-8?q?=E5=86=85=E6=96=87=E4=BB=B6=E7=9A=84=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/service/file.go | 15 +++-------- pkg/io/compress.go | 25 +++++++++++++++++++ pkg/io/io_test.go | 54 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 12 deletions(-) diff --git a/internal/service/file.go b/internal/service/file.go index 6fb87366..be340eba 100644 --- a/internal/service/file.go +++ b/internal/service/file.go @@ -332,28 +332,19 @@ func (s *FileService) UnCompress(w http.ResponseWriter, r *http.Request) { return } - oldList, err := io.ReadDir(req.Path) - if err != nil { - Error(w, http.StatusInternalServerError, "%v", err) - return - } - if err = io.UnCompress(req.File, req.Path); err != nil { Error(w, http.StatusInternalServerError, "%v", err) return } - currentList, err := io.ReadDir(req.Path) + list, err := io.ListCompress(req.File) if err != nil { Error(w, http.StatusInternalServerError, "%v", err) return } - // 取新增的设置权限 - for _, currentDir := range currentList { - if !slices.Contains(oldList, currentDir) { - s.setPermission(filepath.Join(req.Path, currentDir.Name()), 0755, "www", "www") - } + for item := range slices.Values(list) { + s.setPermission(filepath.Join(req.Path, item), 0755, "www", "www") } Success(w, nil) diff --git a/pkg/io/compress.go b/pkg/io/compress.go index ee14067d..24d032c9 100644 --- a/pkg/io/compress.go +++ b/pkg/io/compress.go @@ -89,6 +89,31 @@ func UnCompress(src string, dst string) error { return err } +// ListCompress 获取压缩包内文件列表 +func ListCompress(src string) ([]string, error) { + format, err := formatArchiveByPath(src) + if err != nil { + return nil, err + } + + var out string + switch format { + case Zip: + out, err = shell.Execf("unzip -Z1 '%s'", src) + case TGz, Bz2, Tar, Xz: + out, err = shell.Execf("tar -tf '%s'", src) + case SevenZip: + out, err = shell.Execf(`7z l -slt '%s' | grep "^Path = " | sed 's/^Path = //'`, src) + default: + return nil, errors.New("unsupported format") + } + if err != nil { + return nil, err + } + + return strings.Split(out, "\n"), nil +} + // formatArchiveByPath 根据文件后缀获取压缩格式 func formatArchiveByPath(path string) (FormatArchive, error) { switch filepath.Ext(path) { diff --git a/pkg/io/io_test.go b/pkg/io/io_test.go index 258b720f..bfcb2f49 100644 --- a/pkg/io/io_test.go +++ b/pkg/io/io_test.go @@ -175,6 +175,60 @@ func (s *IOTestSuite) TestUnCompress() { s.NoError(Remove("testdata")) } +func (s *IOTestSuite) TestListCompress() { + abs, err := filepath.Abs("testdata") + s.NoError(err) + src := []string{"list_archive_test1.txt", "list_archive_test2.txt"} + err = Write(filepath.Join(abs, src[0]), "File 1", 0644) + s.NoError(err) + err = Write(filepath.Join(abs, src[1]), "File 2", 0644) + s.NoError(err) + + err = Compress(abs, src, filepath.Join(abs, "list_archive_test.zip")) + s.NoError(err) + err = Compress(abs, src, filepath.Join(abs, "list_archive_test.bz2")) + s.NoError(err) + err = Compress(abs, src, filepath.Join(abs, "list_archive_test.tar")) + s.NoError(err) + err = Compress(abs, src, filepath.Join(abs, "list_archive_test.gz")) + s.NoError(err) + err = Compress(abs, src, filepath.Join(abs, "list_archive_test.tar.gz")) + s.NoError(err) + err = Compress(abs, src, filepath.Join(abs, "list_archive_test.tgz")) + s.NoError(err) + err = Compress(abs, src, filepath.Join(abs, "list_archive_test.xz")) + s.NoError(err) + err = Compress(abs, src, filepath.Join(abs, "list_archive_test.7z")) + s.NoError(err) + + list, err := ListCompress(filepath.Join(abs, "list_archive_test.zip")) + s.NoError(err) + s.Len(list, 2) + list, err = ListCompress(filepath.Join(abs, "list_archive_test.bz2")) + s.NoError(err) + s.Len(list, 2) + list, err = ListCompress(filepath.Join(abs, "list_archive_test.tar")) + s.NoError(err) + s.Len(list, 2) + list, err = ListCompress(filepath.Join(abs, "list_archive_test.gz")) + s.NoError(err) + s.Len(list, 2) + list, err = ListCompress(filepath.Join(abs, "list_archive_test.tar.gz")) + s.NoError(err) + s.Len(list, 2) + list, err = ListCompress(filepath.Join(abs, "list_archive_test.tgz")) + s.NoError(err) + s.Len(list, 2) + list, err = ListCompress(filepath.Join(abs, "list_archive_test.xz")) + s.NoError(err) + s.Len(list, 2) + list, err = ListCompress(filepath.Join(abs, "list_archive_test.7z")) + s.NoError(err) + s.Len(list, 2) + + s.NoError(Remove("testdata")) +} + func (s *IOTestSuite) TestRemoveDeletesFileOrDirectory() { path := "testdata/remove_test" s.NoError(Mkdir(path, 0755))