mirror of https://github.com/cloudreve/Cloudreve
Merge e8ebb6b9d6
into fe7cf5d0d8
commit
f1220b21df
|
@ -10,6 +10,7 @@ import (
|
|||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/bodgit/sevenzip"
|
||||
"github.com/cloudreve/Cloudreve/v4/inventory/types"
|
||||
|
@ -17,6 +18,9 @@ import (
|
|||
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs/dbfs"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/manager/entitysource"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/util"
|
||||
"golang.org/x/text/encoding/charmap"
|
||||
"golang.org/x/text/encoding/simplifiedchinese"
|
||||
"golang.org/x/text/transform"
|
||||
"golang.org/x/tools/container/intsets"
|
||||
)
|
||||
|
||||
|
@ -37,6 +41,30 @@ func init() {
|
|||
gob.Register([]ArchivedFile{})
|
||||
}
|
||||
|
||||
func normalizeArchiveName(rawString string) string {
|
||||
// 1. 有效 UTF-8
|
||||
if utf8.ValidString(rawString) {
|
||||
return rawString
|
||||
}
|
||||
|
||||
// 2. 尝试 GB18030(GBK 的超集)
|
||||
if dec, _, err := transform.String(simplifiedchinese.GB18030.NewDecoder(), rawString); err == nil && utf8.ValidString(dec) {
|
||||
return dec
|
||||
}
|
||||
|
||||
// 3. 尝试 GBK
|
||||
if dec, _, err := transform.String(simplifiedchinese.GBK.NewDecoder(), rawString); err == nil && utf8.ValidString(dec) {
|
||||
return dec
|
||||
}
|
||||
|
||||
// 4. 尝试 CP437(ZIP 规范默认)
|
||||
if dec, _, err := transform.String(charmap.CodePage437.NewDecoder(), rawString); err == nil && utf8.ValidString(dec) {
|
||||
return dec
|
||||
}
|
||||
|
||||
return rawString
|
||||
}
|
||||
|
||||
func (m *manager) ListArchiveFiles(ctx context.Context, uri *fs.URI, entity string) ([]ArchivedFile, error) {
|
||||
file, err := m.fs.Get(ctx, uri, dbfs.WithFileEntities(), dbfs.WithRequiredCapabilities(dbfs.NavigatorCapabilityDownloadFile))
|
||||
if err != nil {
|
||||
|
@ -88,6 +116,10 @@ func (m *manager) ListArchiveFiles(ctx context.Context, uri *fs.URI, entity stri
|
|||
return nil, fmt.Errorf("failed to read file list: %w", err)
|
||||
}
|
||||
|
||||
for i := range fileList {
|
||||
fileList[i].Name = normalizeArchiveName(fileList[i].Name)
|
||||
}
|
||||
|
||||
kv.Set(cacheKey, fileList, ArchiveListCacheTTL)
|
||||
return fileList, nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue