【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
}


目录
相关文章
|
负载均衡 数据安全/隐私保护 Docker
Docker-12:Docker安装Apisix
通过Docker安装APISIX
1884 0
Ant Design Pro:设置哈希hash路由
Ant Design Pro:设置哈希hash路由
316 0
|
9月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
开发工具 数据安全/隐私保护 git
解决方案:Github Support for password authentication was removed on August 13, 2021.
解决方案:Github Support for password authentication was removed on August 13, 2021.
1009 1
解决方案:Github Support for password authentication was removed on August 13, 2021.
【完美解决】Github action报错remote: Write access to repository not granted.
【完美解决】Github action报错remote: Write access to repository not granted.
|
存储 人工智能 Go
探索Gin框架:Golang使用Gin完成文件上传
探索Gin框架:Golang使用Gin完成文件上传
|
数据库
DDD架构浅谈
DDD架构浅谈
354 4
Linux ALSA驱动之二:声卡的创建流程 下
Linux ALSA驱动之二:声卡的创建流程 下
Linux ALSA驱动之二:声卡的创建流程 下
|
Java 关系型数据库 数据库
Seata常见问题之docker运行报错如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
1364 0
|
安全 大数据 API
elasticsearch|大数据|kibana的安装(https+密码)
elasticsearch|大数据|kibana的安装(https+密码)
572 0