当前位置: 首页 > news >正文

文件上传、重定向、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 mainimport ("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 MiBrouter.POST("/upload", func(c *gin.Context) {// Multipart formform, _ := 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) {// 指定重定向的URLc.Request.URL.Path = "/test2"r.HandleContext(c)
})
r.GET("/test2", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"hello": "world"})
})

【例】

package mainimport ("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.comc.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 mainimport ("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"})// ...}})//NoRouter.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 这个库。
其基本原理就是构造一个路由地址的前缀树。

http://www.lryc.cn/news/450762.html

相关文章:

  • 躺平成长:微信小程序运营日记第二天
  • 三分钟速览:Node.js 版本差异与关键特性解析
  • git创建新分支
  • Chip-seq数据分析处理流程
  • spring boot3.2.x与spring boot2.7.x对比
  • Vue2(十三):路由
  • Java并发:互斥锁,读写锁,公平锁,Condition,StampedLock
  • 在 Linux 中,要让某一个线程或进程排他性地独占一个 CPU
  • 滚雪球学MySQL[7.3讲]:数据库日志与审计详解:从错误日志到审计日志的配置与使用
  • 网关的作用及其高可用性设计详解
  • Vortex GPGPU的github流程跑通与功能模块波形探索
  • 10.2 Linux_并发_进程相关函数
  • 【深度学习基础模型】玻尔兹曼机BM|受限玻尔兹曼机RBM|深度置信网络DBN详细理解并附实现代码。
  • 滑动窗口->dd爱框框
  • Python从入门到高手4.1节-掌握条件控制语句
  • 使用Qt实现实时数据动态绘制的折线图示例
  • 【人人保-注册安全分析报告-无验证方式导致安全隐患】
  • Redis6 多线程模型
  • Python的异步编程
  • 初识Linux · 进程等待
  • 面向对象建模
  • MetaJUI v0.4 遇到的一些问题及解决办法记录
  • 从零开始学习OMNeT++系列第二弹——新建一个OMNeT++的工程
  • 【Android】布局优化—include,merge,ViewStub的使用方法
  • 传奇外网架设教程带图文解说—Gee引擎
  • MySQL | excel数据输出insert语句
  • 足球青训俱乐部管理:Spring Boot技术驱动
  • 一次实践:给自己的手机摄像头进行相机标定
  • 【docker学习】Linux系统离线方式安装docker环境方法
  • vscode开发uniapp安装插件指南