package main import ( "archive/zip" "embed" "fmt" "io/fs" "io/ioutil" "mime" "net/http" "os" "strings" "github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2/pkg/options" ) //go:embed frontend/dist var assets embed.FS type FileLoader struct { http.Handler } func NewFileLoader() *FileLoader { return &FileLoader{} } type myCloser interface { Close() error } // closeFile is a helper function which streamlines closing // with error checking on different file types. func closeFile(f myCloser) { err := f.Close() check(err) } func readAll(file fs.File) []byte { // fc, err := file.Open() // check(err) // defer closeFile(fc) content, err := ioutil.ReadAll(file) check(err) return content } // check is a helper function which streamlines error checking func check(e error) { if e != nil { panic(e) } } func (h *FileLoader) ServeHTTP(res http.ResponseWriter, req *http.Request) { if strings.Contains(req.URL.Path, "chrome_tool") { res.Header().Set("Content-Type", "application/json") res.Write([]byte(`{"code":0,"data":[],"info":"操作成功"}`)) return } requestedFilename := strings.TrimPrefix(req.URL.Path, "/") mimeString := mime.TypeByExtension(requestedFilename) if strings.Contains(requestedFilename, ".js") { mimeString = "application/javascript" } res.Header().Set("Content-Type", mimeString) if strings.Contains(req.URL.Path, "/plugin/") { paths := strings.Split(requestedFilename, "/") fmt.Printf("%#v\n", paths) pluginName := paths[1] filename := "" if len(paths) == 2 { filename = "index.html" } else { filename = strings.Join(paths[2:], "/") } requestedFilename = "./plugin/" + pluginName + ".zip" // 打开一个zip格式文件 r, err := zip.OpenReader(requestedFilename) if err != nil { res.WriteHeader(http.StatusNotFound) res.Write([]byte(err.Error())) return } defer r.Close() fmt.Printf("filename %#v\n", filename) f, err := r.Open(filename) if err != nil { res.WriteHeader(http.StatusNotFound) res.Write([]byte(err.Error())) return } defer f.Close() res.Header().Set("Cache-Control", "max-age=604800") res.Write(readAll(f)) } else { fileData, err := os.ReadFile(requestedFilename) if err != nil { res.WriteHeader(http.StatusNotFound) res.Write([]byte("404")) return } res.Write(fileData) } } func main() { // Create an instance of the app structure app := NewApp() // Create application with options err := wails.Run(&options.App{ Title: "网页工具箱", Width: 1024, Height: 768, Assets: assets, BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1}, OnStartup: app.startup, AssetsHandler: NewFileLoader(), Bind: []interface{}{ app, }, }) if err != nil { println("Error:", err) } }