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  }