Skip to content

Commit f693f29

Browse files
authored
feat: 优化unzip逻辑
io.Copy 后立即调用 Unzip,但 out 由 defer 关闭,可能在解压时尚未关闭
2 parents fd9883e + 2fda961 commit f693f29

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

server/service/system/auto_code_plugin.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ import (
44
"bytes"
55
"context"
66
"fmt"
7+
"go/parser"
8+
"go/printer"
9+
"go/token"
10+
"io"
11+
"mime/multipart"
12+
"os"
13+
"path/filepath"
14+
"strings"
15+
716
"github.com/flipped-aurora/gin-vue-admin/server/global"
817
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
918
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
@@ -13,14 +22,6 @@ import (
1322
cp "github.com/otiai10/copy"
1423
"github.com/pkg/errors"
1524
"go.uber.org/zap"
16-
"go/parser"
17-
"go/printer"
18-
"go/token"
19-
"io"
20-
"mime/multipart"
21-
"os"
22-
"path/filepath"
23-
"strings"
2425
)
2526

2627
var AutoCodePlugin = new(autoCodePlugin)
@@ -42,13 +43,27 @@ func (s *autoCodePlugin) Install(file *multipart.FileHeader) (web, server int, e
4243
}
4344
defer src.Close()
4445

46+
// 在临时目录创建目标文件
47+
// 使用完整路径拼接的好处:明确文件位置,避免路径混乱
4548
out, err := os.Create(GVAPLUGPINATH + file.Filename)
4649
if err != nil {
4750
return -1, -1, err
4851
}
49-
defer out.Close()
5052

53+
// 将上传的文件内容复制到临时文件
54+
// 使用io.Copy的好处:高效处理大文件,自动管理缓冲区,避免内存溢出
5155
_, err = io.Copy(out, src)
56+
if err != nil {
57+
out.Close()
58+
return -1, -1, err
59+
}
60+
61+
// 立即关闭文件,确保数据写入磁盘并释放文件句柄
62+
// 必须在解压前关闭,否则在Windows系统上会导致文件被占用无法解压
63+
err = out.Close()
64+
if err != nil {
65+
return -1, -1, err
66+
}
5267

5368
paths, err := utils.Unzip(GVAPLUGPINATH+file.Filename, GVAPLUGPINATH)
5469
paths = filterFile(paths)

0 commit comments

Comments
 (0)