当前位置: 首页 > 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 这个库。
其基本原理就是构造一个路由地址的前缀树。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 感知算法引入时序模型的优势
  • chapter 12 Bandgap References
  • Linux(6)--CentOS目录
  • Android架构组件:MVVM模式的实战应用与数据绑定技巧
  • 【前端】ES6:Proxy代理和Reflect对象
  • 第五章 继承、多态、抽象类与接口 (4)
  • 简单了解 JVM
  • 前端入门:HTML+CSS简便开发的技巧
  • 没错,我给androidx修了一个bug!
  • 2024PDF内容修改秘籍:工具推荐与技巧分享
  • SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(上)
  • K8s容器运行时,移除Dockershim后存在哪些疑惑?
  • SpringBoot中基于Mybatis-Plus多表联查(无xml,通过注解实现)
  • WEB应用服务器TOMCAT
  • 【力扣】2376. 统计特殊整数
  • 2018一半小结一波
  • const let
  • CSS 专业技巧
  • IOS评论框不贴底(ios12新bug)
  • JavaScript的使用你知道几种?(上)
  • k个最大的数及变种小结
  • Laravel 菜鸟晋级之路
  • nginx 配置多 域名 + 多 https
  • Node项目之评分系统(二)- 数据库设计
  • PaddlePaddle-GitHub的正确打开姿势
  • python 装饰器(一)
  • python学习笔记 - ThreadLocal
  • Redux 中间件分析
  • vue的全局变量和全局拦截请求器
  • Zsh 开发指南(第十四篇 文件读写)
  • 回顾 Swift 多平台移植进度 #2
  • 马上搞懂 GeoJSON
  • 强力优化Rancher k8s中国区的使用体验
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 思维导图—你不知道的JavaScript中卷
  • 用jquery写贪吃蛇
  • 在Mac OS X上安装 Ruby运行环境
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • #{} 和 ${}区别
  • #13 yum、编译安装与sed命令的使用
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $jQuery 重写Alert样式方法
  • (C++17) std算法之执行策略 execution
  • (南京观海微电子)——示波器使用介绍
  • (七)c52学习之旅-中断
  • (四)图像的%2线性拉伸
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)原始图像数据和PDF中的图像数据
  • .ai域名是什么后缀?
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .jks文件(JAVA KeyStore)
  • .NET 依赖注入和配置系统