知识分享系列目前包含Java、Golang、Linux、Docker等等。
当我们使用Golang进行开发web程序时,无法避免的会使用到static静态资源文件(前后端分离除外),这时我们的程序打包后就会产生静态资源文件夹和一个二进制执行程序,本节我们就将其静态资源也打包进去,具体方式如下:
本节使用的golang标准库import "embed" 包,需要golang版本1.16以上,小伙伴们在使用时需要注意,另外本节使用gin框架进行。
1、创建需要使用的embed.FS对象
静态资源目录如下:
这里注意,//go:embed static注释会引导Static embed.FS寻找到我们的静态资源目录,因此务必不要遗漏设置。
2、在gin初始化时进行设置静态资源
这时编辑后,我们就只会产生一个二进制程序,启动后访问静态资源的地址就是 http://127.0.0.1:8080/assets/static 具体地址
// 静态WEB服务:func (this *HttpHandler) serveStatic(w http.ResponseWriter, r *http.Request) bool {
path := r.URL.Path
if path == `` || path == `/` {
return false
}
//判断是否支持GZIP压缩 //测试表明浏览器第一个都是gzip 不排除特殊的,暂时不考虑
isGzip := Config.Http.Gzip && strings.HasPrefix(r.Header.Get("Accept-Encoding"), "gzip")
w.Header().Set("Content-Type", "text/htmlcharset=utf-8")
// 以前缀
if strings.HasPrefix(path, Config.Http.StaticDir) {
// 获取后缀
strs := strings.Split(path, `.`)
if len(strs) == 1 {
return false
}
//'正则替换下OK'
if isGzip && regexp.MustCompile(`(^|,)`+strs[1]+`[,$]`).MatchString("html,htm,txt,js,json,xml") {
// 读取文件
data, err := ioutil.ReadFile(`.` + path)
if err != nil {
http.NotFoundHandler().ServeHTTP(w, r)
// 这里需要日志系统
return true
}
//GZIP压缩
if tp, ok := ContentType[strs[1]] /*vars*/ ok {
w.Header().Set("Content-Type", tp)
} else {
//暂时 text/html报头
w.Header().Set("Content-Type", "text/htmlcharset=utf-8")
}
// 这里也要设置的, 否则GOLANG根据文件头来决定返回什么格式而这种,即使是图片,也会是text返回
w.Header().Set("Content-Encoding", "gzip")
w.Header().Set("Vary", "Content-Encoding")
wbuf := &bytes.Buffer{}
g, _ := gzip.NewWriterLevel(wbuf, 9)
g.Write(data)
g.Close()
//Print(buf)
w.Write(wbuf.Bytes())
return true
}
http.ServeFile(w, r, "."+path)
return true
}
// 根路径 || path == "/wpad.dat" 我发现会访问这个文件: 以后研究这个问题
if path == "/favicon.ico" || path == "robots.txt" || path == "/wpad.dat" {
http.ServeFile(w, r, "."+path)
return true
}
return false
// 日志系统呢? 静态文件就不要日志系统吧,没有必要
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)