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.
树
© 著作权归作者所有,转载或内容合作请联系作者 禁止转载,如需转载请通过简信或评论联系作者。
没有回复内容