gin框架03-后端论坛-技术分享-千百度社区

gin框架03

gin框架03

上传单个文件

上传单个文件.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="http://127.0.0.1:8000/upload" method="post" enctype="multipart/form-data">
    头像:
    <input type="file" name="file">
    <br>
    <input type="submit" value="提交">
    <br>
</form>
</body>
</html>
package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "log"
)
// gin的Hellowork

func main() {
    // 1. 创建路由器
    r := gin.Default()
    //  2. 绑定路由规则,执行函数
    // gin.Context,封装了request和respones
    r.POST("/upload", func(c *gin.Context) {
        // 表单取文件
        file, _ := c.FormFile("file")
        log.Println(file.Filename)
        // 传到项目录,名字就用来本身的
        c.SaveUploadedFile(file,file.Filename)
        // 打印信息
        c.String(200,fmt.Sprintf("'%s' upload!",file.Filename))
    })
    // 3.监听端口,默认8080
    r.Run(":8000")

}

结果.png

上传多个文件

修改的地方

package main

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

func main() {
    // 1. 创建路由器
    r := gin.Default()
    //  限定表单上传大小 8MB,默认为32MB
    r.MaxMultipartMemory = 8 << 20

    r.POST("/upload", func(c *gin.Context) {
        form, err := c.MultipartForm()
        if err != nil {
            c.String(http.StatusBadRequest,fmt.Sprintf("get err %s",err.Error()))
        }
        // 获取所有图片
        files := form.File["files"]
        for _,file := range files {
            // 逐个存
            if err:=c.SaveUploadedFile(file,file.Filename);err!=nil{
                c.String(http.StatusBadRequest,fmt.Sprintf("upload err %s",err.Error()))
                return
            }
        }
        c.String(200,fmt.Sprintf("upload ok %d files!"),len(files))
    })
    // 3.监听端口,默认8080
    r.Run(":8000")

}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="http://127.0.0.1:8000/upload" method="post" enctype="multipart/form-data">
    头像:
    <input type="file" name="files" multiple>
    <br>
    <input type="submit" value="提交">
    <br>
</form>
</body>
</html>

routes group

route group是为了管理一些相同的URL

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
)
// gin的Hellowork

func main() {
    // 1. 创建路由器
    r := gin.Default()
    // 路由组1,处理GET请求
    v1 := r.Group("v1")
    // {} 书写规范
    {
        v1.GET("/login",login)
        v1.GET("submit",submit)
    }
    v2 := r.Group("/v2")
    {
        v2.POST("/login",login)
        v2.POST("/submit",submit)
    }
    // 3.监听端口,默认8080
    r.Run(":8000")
}

func login(c *gin.Context){
    name := c.DefaultQuery("name","jack")
    c.String(200,fmt.Sprintf("hello %s \n",name))
}
func submit(c *gin.Context){
    name := c.DefaultQuery("name","lily")
    c.String(200,fmt.Sprintf("hello %s \n",name))
}

cmd测试

curl http://127.0.0.1:8000/v1/login?name=zhangsan
curl http://127.0.0.1:8000/v1/login?name=zhangsan

路由原理

httproter会将所有路由规则构造一颗前缀树
例如有root and as cn com

package main

import (
    "github.com/gin-gonic/gin"
)
// gin的Hellowork

func main() {
    // 1. 创建路由器
    r := gin.Default()
    // 路由组1,处理GET请求
    r.POST("/",xxx)
    r.POST("search",xxx)
    r.POST("/blog/:post",xxx)
    r.POST("/contact",xxx)
    r.POST("/about",xxx)
    // 3.监听端口,默认8080
    r.Run(":8000")
}

前缀树和基数树(radix tree)的区别:
trie又叫前缀树,是一个多叉树,广泛应用于字符串搜索,每个树节点存储一个字符,从根节点到任意一个叶子结点串起来就是一个字符串;radix tree是优化之后的前缀树,对空间进一步压缩。

下图左侧是字符串 sex,seed,sleep,son 四个字段串的Trie数据结构表示. 可用看到sleep这个字符串需要5个节点表示. 其实e后面只跟一个p, 也就是只有一个子节点, 是完全可以和父节点压缩合并的. 右侧是优化后的数据结构, 节省了空间,同时也提高了查询效率(左边字符串sleep查询需要5步, 右边只需要3步), 这就是radix tree.


gin框架httprouter路由原理

© 著作权归作者所有,转载或内容合作请联系作者 禁止转载,如需转载请通过简信或评论联系作者。

请登录后发表评论

    没有回复内容