diff --git a/internal/archive/zip/utils.go b/internal/archive/zip/utils.go index 81b47782..aa51b88e 100644 --- a/internal/archive/zip/utils.go +++ b/internal/archive/zip/utils.go @@ -59,7 +59,7 @@ func _decompress(file *zip.File, targetPath, password string, up model.UpdatePro return err } defer rc.Close() - f, err := os.OpenFile(stdpath.Join(targetPath, file.FileInfo().Name()), os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600) + f, err := os.OpenFile(stdpath.Join(targetPath, decodeName(file.FileInfo().Name())), os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600) if err != nil { return err } @@ -87,12 +87,27 @@ func filterPassword(err error) error { func decodeName(name string) string { b := []byte(name) detector := chardet.NewTextDetector() - result, err := detector.DetectBest(b) + results, err := detector.DetectAll(b) if err != nil { return name } - enc := getEncoding(result.Charset) - if enc == nil { + var ce, re, enc encoding.Encoding + for _, r := range results { + if r.Confidence > 30 { + ce = getCommonEncoding(r.Charset) + if ce != nil { + break + } + } + if re == nil { + re = getEncoding(r.Charset) + } + } + if ce != nil { + enc = ce + } else if re != nil { + enc = re + } else { return name } i := bytes.NewReader(b) @@ -101,8 +116,30 @@ func decodeName(name string) string { return string(content) } +func getCommonEncoding(name string) (enc encoding.Encoding) { + switch name { + case "UTF-8": + enc = unicode.UTF8 + case "UTF-16LE": + enc = unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM) + case "Shift_JIS": + enc = japanese.ShiftJIS + case "GB-18030": + enc = simplifiedchinese.GB18030 + case "EUC-KR": + enc = korean.EUCKR + case "Big5": + enc = traditionalchinese.Big5 + default: + enc = nil + } + return +} + func getEncoding(name string) (enc encoding.Encoding) { switch name { + case "UTF-8": + enc = unicode.UTF8 case "UTF-16BE": enc = unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) case "UTF-16LE": diff --git a/internal/archive/zip/zip.go b/internal/archive/zip/zip.go index e5285518..9dc8cc76 100644 --- a/internal/archive/zip/zip.go +++ b/internal/archive/zip/zip.go @@ -35,7 +35,6 @@ func (*Zip) GetMeta(ss *stream.SeekableStream, args model.ArchiveArgs) (model.Ar for _, file := range zipReader.File { if file.IsEncrypted() { encrypted = true - break } name := strings.TrimPrefix(decodeName(file.Name), "/") @@ -70,6 +69,7 @@ func (*Zip) GetMeta(ss *stream.SeekableStream, args model.ArchiveArgs) (model.Ar dirObj.IsFolder = true dirObj.Name = stdpath.Base(dir) dirObj.Modified = file.ModTime() + dirObj.Children = make([]model.ObjTree, 0) } if isNewFolder { // 将 文件夹 添加到 父文件夹 diff --git a/server/handles/archive.go b/server/handles/archive.go index 6ff13641..fab3916e 100644 --- a/server/handles/archive.go +++ b/server/handles/archive.go @@ -39,7 +39,7 @@ type ArchiveMetaResp struct { type ArchiveContentResp struct { ObjResp - Children []ArchiveContentResp `json:"children,omitempty"` + Children []ArchiveContentResp `json:"children"` } func toObjsRespWithoutSignAndThumb(obj model.Obj) ObjResp {