自学内容网 自学内容网

文件上传、重定向、Gin路由

文件上传

单个文件上传

index.html

文件上传前端页面代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title>index</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="f1">
    <br>
    <input type="submit" value="上传">
</form>
</body>
</html>

main.go

后端gin框架部分代码:

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.StatusOK, 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(":8080")
}

在这里插入图片描述
选择1111.jpg点击上传:
在这里插入图片描述
在这里插入图片描述

多个文件上传

多个文件上传

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

请求重定向

HTTP重定向

HTTP 重定向很容易。 内部、外部重定向均支持。

r.GET("/test", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, "http://www.sogo.com/")
})

路由重定向

路由重定向,使用 HandleContext

r.GET("/test", func(c *gin.Context) {
    // 指定重定向的URL
    c.Request.URL.Path = "/test2"
    r.HandleContext(c)
})
r.GET("/test2", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{"hello": "world"})
})

【例】

package main

import (
"github.com/gin-gonic/gin"
"net/http"
)

func main() {
r := gin.Default()

// Gin路由
r.GET("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"status": "ok",
})
})

// HTTP重定向
r.GET("/index1", func(c *gin.Context) {
// 跳转到 sogo.com
c.Redirect(http.StatusMovedPermanently, "http://www.sogo.com")
})

// 路由重定向
r.GET("/a", func(c *gin.Context) {
// 跳转到 /b 对应的路由处理函数
c.Request.URL.Path = "/b" // 把请求的URI修改
r.HandleContext(c)        // 继续后续的处理
})
r.GET("/b", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "b",
})
})
r.Run(":8080")

在这里插入图片描述
在这里插入图片描述

Gin路由

普通路由和路由组

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

【例】

package main

import (
"github.com/gin-gonic/gin"
"net/http"
)

func main() {
r := gin.Default()
// 访问/index的GET请求会走这一条处理逻辑
// 路由
// 获取数据
r.GET("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"method": "GET",
})
})

// 提交数据
r.POST("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"method": "POST",
})
})

// 更新数据
r.PUT("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"method": "PUT",
})
})

// 删除数据(如果实现的话)
r.DELETE("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"method": "DELETE",
})
})

// Any 请求方法的大集合
r.Any("/user", func(c *gin.Context) {
switch c.Request.Method {
case "GET":
c.JSON(http.StatusOK, gin.H{"method": "GET"})
case http.MethodPost:
c.JSON(http.StatusOK, gin.H{"method": "POST"})
// ...
}
})

//NoRoute
r.NoRoute(func(c *gin.Context) {
c.JSON(http.StatusNotFound, gin.H{"msg": "liwenzhou.com"})
})

/*
//视频的首页和详情页
r.GET("/video/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/index",
})
})
r.GET("/video/xx", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/xx",
})
})
//商城的首页和详情页
r.GET("/shop/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/shop/index",
})
})
r.GET("/shop/oo", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/shop/oo",
})
})
*/

// 路由组
// 把公用的前缀提取出来,创建一个路由组
videoGroup := r.Group("/video")
videoGroup.GET("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/index",
})
})
videoGroup.GET("/xx", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/xx",
})
})

shopGroup := r.Group("/shop")
shopGroup.GET("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/shop/index",
})
})
shopGroup.GET("/oo", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/shop/oo",
})
})

r.Run(":9090")
}

路由原理

Gin框架中的路由使用的是 httprouter 这个库。
其基本原理就是构造一个路由地址的前缀树。


原文地址:https://blog.csdn.net/2301_79890350/article/details/142372469

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!