静态文件的加载
main.go
func main() {
r := gin.Default()
//加载静态模板
r.Static("static", "./../web/static")
now := time.Now()
today := now.Format("2006年01月02日")
r.GET("/index", func(c *gin.Context) {
//加载模板文件
r.LoadHTMLFiles("./../web/template/index.html")
c.HTML(http.StatusOK, "./../web/template/index.html", gin.H{
"lang": "Go",
"time": today,
})
})
err := r.Run("0.0.0.0:8080")
if err != nil {
fmt.Println(err.Error())
}
}
index.html
<body>
<p>静态文件的加载</p>
<p>Study {{.lang}} language</p>
<p>今天是 {{.time}}</p>
</body>
常用的静态文件加载有三个函数:
r.Static("static", "./../web/static")
r.StaticFS("static", http.Dir("./../web/static"))
r.StaticFile("favicon.ico", "./../web/favicon.ico")
-
Static()可以加载整个静态文件的目录,第一个参数是api,第二个参数是那个静态文件目录相对于当前执行这条语句的相对路径,当然也可以写绝对路径,绝对路径就是:“D:/GolandProjects/blog_demo/web/static”,不是以当前项目名为根目录,而是D盘为根目录。
-
StaticFS()从本质上说其功能和r.Static()完全一样,那功能完全一样为什么还要写两个方法呢?这只是一个习惯差别,一般来说:r.Static()用于加载项目内的静态文件目录,而r.StaticFS()用于加载文件系统中的静态文件目录,比如:整个项目的文件在D盘,可以加载C盘的静态文件目录。
r.StaticFS("static", http.Dir("C:/Users/86136/Desktop/static"))
因为这两个方法的底层实现代码完全一样,所有功能也完全一样。下面是gin包下面这两个方法的源代码
func (group *RouterGroup) Static(relativePath, root string) IRoutes { return group.StaticFS(relativePath, Dir(root, false)) } func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes { if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") { panic("URL parameters can not be used when serving a static folder") } handler := group.createStaticHandler(relativePath, fs) urlPattern := path.Join(relativePath, "/*filepath") // Register GET and HEAD handlers group.GET(urlPattern, handler) group.HEAD(urlPattern, handler) return group.returnObj() }
-
StaticFile()用于加载单个静态文件,如:favicon.ico文件。
模板文件的加载
加载模块文件(HTML文件)的方法有两个LoadHTMLFiles()和LoadHTMLGlob()
-
LoadHTMLFiles()使用的注意事项:
- LoadHTMLFiles()方法可以加载多个模板文件,每个模板文件用逗号隔开,就像下面这样:
r.LoadHTMLFiles("./../web/template/login.html", "./../web/template/temp/footer.html")
- LoadHTMLFiles()方法只能使用一次,如果写成下面这样,会报错
r.LoadHTMLFiles("./../web/template/login.html") r.LoadHTMLFiles("./../web/template/temp/footer.html")
-
LoadHTMLGlob()使用的注意事项:
LoadHTMLGlob()用来加载大量的模板文件,但是写法非常固定。只能有如下写法:
第一种写法:
r.LoadHTMLGlob("./../web/blog/**/*") //**表示所有目录,如果blog下面有html文件就会加载失败。
加载blog目录下的所有目录,这样每个目录下面的文件都会被认为是模板文件。需要注意的是blog目录下面只能存在目录文件夹,不能有html模板文件,如下图所示就适合用第一种写法(blog下面只有documents目录和template目录):
第二种写法:
r.LoadHTMLGlob("./../web/template/*") //*表示所有html文件,如果template下面有目录文件夹就会加载失败。
如果template目录下面有100个模板文件(没有目录文件),就适合用这种写法
对于下图这种情况,我目前还没有发现使用LoadHTMLGlob()的写法,因为template目录下面既有目录又有模板文件,而且LoadHTMLGlob()方法也只能使用一次,解决的办法就是使用LoadHTMLFiles()方法一个一个的去加载;或者将index.html和login.html放到一个新建目录中,就可以使用LoadHTMLGlob()方法的第一种写法。
文件的上传
submit.html
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" value="上传文件">
<input type="submit" value="上传">
</form>
main.go
r.POST("/upload", func(c *gin.Context) {
// 单个文件
file, err := c.FormFile("file")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
})
return
}
log.Println(file.Filename)
// 上传文件到指定的目录
dst := fmt.Sprintf("C:/Users/86136/Desktop/%s", file.Filename)
err = c.SaveUploadedFile(file, dst)
if err != nil {
return
}
c.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("'%s' uploaded!", file.Filename),
})
})