github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/bootstrap/fs.go (about) 1 package bootstrap 2 3 import ( 4 "archive/zip" 5 "crypto/sha256" 6 "github.com/cloudreve/Cloudreve/v3/pkg/util" 7 "github.com/pkg/errors" 8 "io" 9 "io/fs" 10 "sort" 11 "strings" 12 ) 13 14 func NewFS(zipContent string) fs.FS { 15 zipReader, err := zip.NewReader(strings.NewReader(zipContent), int64(len(zipContent))) 16 if err != nil { 17 util.Log().Panic("Static resource is not a valid zip file: %s", err) 18 } 19 20 var files []file 21 err = fs.WalkDir(zipReader, ".", func(path string, d fs.DirEntry, err error) error { 22 if err != nil { 23 return errors.Errorf("无法获取[%s]的信息, %s, 跳过...", path, err) 24 } 25 26 if path == "." { 27 return nil 28 } 29 30 var f file 31 if d.IsDir() { 32 f.name = path + "/" 33 } else { 34 f.name = path 35 36 rc, err := zipReader.Open(path) 37 if err != nil { 38 return errors.Errorf("无法打开文件[%s], %s, 跳过...", path, err) 39 } 40 defer rc.Close() 41 42 data, err := io.ReadAll(rc) 43 if err != nil { 44 return errors.Errorf("无法读取文件[%s], %s, 跳过...", path, err) 45 } 46 47 f.data = string(data) 48 49 hash := sha256.Sum256(data) 50 for i := range f.hash { 51 f.hash[i] = ^hash[i] 52 } 53 } 54 files = append(files, f) 55 return nil 56 }) 57 if err != nil { 58 util.Log().Panic("初始化静态资源失败: %s", err) 59 } 60 61 sort.Slice(files, func(i, j int) bool { 62 fi, fj := files[i], files[j] 63 di, ei, _ := split(fi.name) 64 dj, ej, _ := split(fj.name) 65 66 if di != dj { 67 return di < dj 68 } 69 return ei < ej 70 }) 71 72 var embedFS FS 73 embedFS.files = &files 74 return embedFS 75 }