Web应用通常需要提供静态资源,如CSS、JavaScript、图片等。Gin框架提供了多种方法来处理静态文件。
1. 静态文件服务方法
Gin提供了以下静态文件服务方法:
Static():提供静态文件服务StaticFile():提供单个静态文件服务StaticFS(): 提供静态文件服务(自定义文件系统)StaticFileFS():提供单个静态文件服务(自定义文件系统)
2. 静态文件服务
Static()方法用于从指定的文件系统根目录提供静态文件服务。
源码:
func(group*RouterGroup)Static(relativePath,rootstring)IRoutes{returngroup.StaticFS(relativePath,Dir(root,false))}- relativePath 参数用于指定路由的路径。
- root 参数用于指定文件系统的根目录。
项目示例:
project目录
static
css
index.css
body{background-color:#fafafa;font-family:'Open Sans',sans-serif;font-size:16px;line-height:1.5;}
js
index.js
functiongetDate(){returnnewDate().toISOString().slice(0,10)}
main.go
funcmain(){// 创建路由r:=gin.Default()// 静态文件服务r.Static("/static","./static")// 启动服务(默认端口8080)err:=r.Run()iferr!=nil{return}}
测试:
访问
http://127.0.0.1:8080/static/css/index.cssbody{background-color:#fafafa;font-family:'Open Sans',sans-serif;font-size:16px;line-height:1.5;}访问
http://127.0.0.1:8080/static/js/index.jsfunctiongetDate(){returnnewDate().toISOString().slice(0,10)}
3. 单个静态文件服务
StaticFile方法用于注册单个路由,为指定的单个本地文件提供服务。
源码:
func(group*RouterGroup)StaticFile(relativePath,filepathstring)IRoutes{returngroup.staticFileHandler(relativePath,func(c*Context){c.File(filepath)})}- relativePath 参数用于指定路由路径。
- filepath 参数用于指定单个文件的路径。
项目示例:
project目录
static
css
index.css
body{background-color:#fafafa;font-family:'Open Sans',sans-serif;font-size:16px;line-height:1.5;}
js
index.js
functiongetDate(){returnnewDate().toISOString().slice(0,10)}
main.go
funcmain(){// 创建路由r:=gin.Default()// 单个静态文件服务r.StaticFile("/static/css/index.css","./static/css/index.css")// 单个静态文件服务r.StaticFile("/static/js/index.js","./static/js/index.js")// 启动服务(默认端口8080)err:=r.Run()iferr!=nil{return}}
测试:
访问
http://127.0.0.1:8080/static/css/index.cssbody{background-color:#fafafa;font-family:'Open Sans',sans-serif;font-size:16px;line-height:1.5;}访问
http://127.0.0.1:8080/static/js/index.jsfunctiongetDate(){returnnewDate().toISOString().slice(0,10)}
4. 自定义文件系统的静态文件服务
StaticFS、StaticFileFS方法与前面介绍的两个方法类似,但是增加了一个fs http.FileSystem参数,用于指定使用的文件系统。
gin默认使用
gin.Dir()
源码:
// StaticFS 自定义文件系统的静态文件服务func(group*RouterGroup)StaticFS(relativePathstring,fs http.FileSystem)IRoutes{ifstrings.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 handlersgroup.GET(urlPattern,handler)group.HEAD(urlPattern,handler)returngroup.returnObj()}// StaticFileFS 自定义文件系统的单个静态文件服务func(group*RouterGroup)StaticFileFS(relativePath,filepathstring,fs http.FileSystem)IRoutes{returngroup.staticFileHandler(relativePath,func(c*Context){c.FileFromFS(filepath,fs)})}对应前面的项目示例,使用这两个方法的go代码如下:
使用
StaticFSfuncmain(){// 创建路由r:=router.NewHttpRouter()// 指定文件系统的静态文件服务r.StaticFS("/static",http.Dir("./font/static"))// 启动服务(默认端口8080)err:=r.Run()iferr!=nil{return}}使用
StaticFileFSfuncmain(){// 创建路由r:=router.NewHttpRouter()// 指定文件系统的单个静态文件服务r.StaticFileFS("/static/css/index.css","index.css",http.Dir("./font/static/css"))// 指定文件系统的单个静态文件服务r.StaticFileFS("/static/js/index.js","index.js",http.Dir("./font/static/js"))// 启动服务(默认端口8080)err:=r.Run()iferr!=nil{return}}