【Gin】文件上传,请求重定向,路由和路由组

简介: 路由组我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,这只是为了看着清晰,你用不用{}包裹功能上没什么区别。


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()
}


版权声明:本段代码来源:李文周的博客

https://www.liwenzhou.com/posts/Go/Gin_framework/


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
}


目录
相关文章
若依修改,改若依首页,若依修改了路由不出现如何解决,修改路由必须在permission.js中的白名单添加新的路由,修改了路由,不出现,解决方法是在白名单中添加对应的路径:
若依修改,改若依首页,若依修改了路由不出现如何解决,修改路由必须在permission.js中的白名单添加新的路由,修改了路由,不出现,解决方法是在白名单中添加对应的路径:
|
5月前
|
安全
tp5使用ueditor请求后台配置项http错误,上传功能将不能正常使用!
tp5使用ueditor请求后台配置项http错误,上传功能将不能正常使用!
385 0
|
5月前
|
缓存 网络协议 搜索推荐
gin框架学习笔记(三) ——路由请求与相关参数
gin框架学习笔记(三) ——路由请求与相关参数
SpringMVC 如何设定重定向和转发的?
SpringMVC 如何设定重定向和转发的?
62 0
|
存储 移动开发 前端开发
前端路由如何修改 URL ?
前端路由需要实现两个核心, 1. 修改 URL 而不引起页面刷新, 2. 检测 URL 的变化, 这两个核心取决于你采用的前端路由技术选择的方案, 即 hash 和 history, 当选择了技术后,
|
JSON Java 数据格式
SpringCloud GateWay通过过滤器GatewayFilter修改请求或响应内容
Spring Cloud Gateway在有些场景中需要获取request body内容进行参数校验或参数修改,我们通过在GatewayFilter中获取请求内容来获取和修改请求体,下面我们就基于ServerWebExchange来实现。
1430 0
|
Java PHP
路由重定向
路由重定向
139 0
|
消息中间件 RocketMQ 开发者
路由注册之处理请求包|学习笔记
快速学习路由注册之处理请求包
路由注册之处理请求包|学习笔记
|
JavaScript 开发者
路由-路由 redirect 重定向的使用|学习笔记
快速学习路由-路由 redirect 重定向的使用
238 0
路由-路由 redirect 重定向的使用|学习笔记
|
JavaScript 开发者
路由-路由redirect重定向的使用|学习笔记
快速学习路由-路由redirect重定向的使用
305 0
路由-路由redirect重定向的使用|学习笔记