1.单个文件上传
模板文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>upload</title> </head> <body> <form action="/upload/" method="post" enctype="multipart/form-data"> <input type="file" name="f1"> <input type="submit" value="上传"> </form> </body> </html>
go文件上传:
package main import ( "github.com/gin-gonic/gin" "net/http" "path" ) func main() { r := gin.Default() r.LoadHTMLFiles("./index.html") r.GET("/index", func(c *gin.Context) { c.HTML(http.StatusOK, "index.html", nil) }) r.POST("/upload", func(c *gin.Context) { // 从请求中读取文件内容 f, err := c.FormFile("f1") if err != nil { c.JSON(http.StatusBadRequest, gin.H{ "error": err.Error(), }) } else { // 文件保存到本地 // dst := fmt.Sprintf("./%s", f.Filename) dst := path.Join("./", f.Filename) c.SaveUploadedFile(f, dst) c.JSON(http.StatusOK, gin.H{ "status": "ok", }) } }) r.Run(":9090") // 启动server }
2.多文件上传
func main() { router := gin.Default() // 处理multipart forms提交文件时默认的内存限制是32 MiB // 可以通过下面的方式修改 // router.MaxMultipartMemory = 8 << 20 // 8 MiB router.POST("/upload", func(c *gin.Context) { // Multipart form form, _ := c.MultipartForm() files := form.File["file"] for index, file := range files { log.Println(file.Filename) dst := fmt.Sprintf("C:/tmp/%s_%d", file.Filename, index) // 上传文件到指定的目录 c.SaveUploadedFile(file, dst) } c.JSON(http.StatusOK, gin.H{ "message": fmt.Sprintf("%d files uploaded!", len(files)), }) }) router.Run() }
版权声明:本段代码来源:李文周的博客
3.重定向
HTTP重定向
HTTP 重定向很容易。 内部、外部重定向均支持
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() r.GET("/index", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com/") }) r.Run(":9090") // 启动server }
请求index路径时,会重定向到百度网
路由重定向
路由重定向,使用HandleContext
:
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() r.GET("/in", func(c *gin.Context) { c.Request.URL.Path = "/test" r.HandleContext(c) }) r.GET("/test", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "this is test url!", }) }) r.Run(":9090") // 启动server }
此时访问路径:http://127.0.0.1:9090/in
输出:{“message”:“this is test url!”}
4.路由
普通路由
r.GET("/index", func(c *gin.Context) {...}) r.GET("/login", func(c *gin.Context) {...}) r.POST("/login", func(c *gin.Context) {...})
此外,还有一个可以匹配所有请求方法的Any
方法如下:
r.Any("/test", func(c *gin.Context) {...})
为没有配置处理函数的路由添加处理程序,默认情况下它返回404代码,下面的代码为没有匹配到路由的请求都返回views/404.html页面。
r.NoRoute(func(c *gin.Context) { c.HTML(http.StatusNotFound, "views/404.html", nil) })
路由组
我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,这只是为了看着清晰,你用不用{}包裹功能上没什么区别。
package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() userGroup := r.Group("/user") { userGroup.GET("/index", func(c *gin.Context) { }) userGroup.GET("/login", func(c *gin.Context) { }) userGroup.POST("/login", func(c *gin.Context) { }) } shopGroup := r.Group("/shop") { shopGroup.GET("/index", func(c *gin.Context) { }) shopGroup.GET("/cart", func(c *gin.Context) { }) shopGroup.POST("/checkout", func(c *gin.Context) { }) } r.Run(":9090") // 启动server }