• Gin 文件上传操作(单/多文件操作)


    参考地址:

    单文件 | Gin Web Framework (gin-gonic.com)icon-default.png?t=N7T8https://gin-gonic.com/zh-cn/docs/examples/upload-file/single-file/

    单文件

    官方案例:

    1. func main() {
    2. router := gin.Default()
    3. // 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)
    4. router.MaxMultipartMemory = 8 << 20 // 8 MiB
    5. router.POST("/upload", func(c *gin.Context) {
    6. // 单文件
    7. file, _ := c.FormFile("file")
    8. log.Println(file.Filename)
    9. dst := "./" + file.Filename
    10. // 上传文件至指定的完整文件路径
    11. c.SaveUploadedFile(file, dst)
    12. c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
    13. })
    14. router.Run(":8080")
    15. }

    操作案例:

    我们选择之前的userRoute以及userAddControl进行操作,结合模板(新创建模板)进行渲染

    1、渲染模板:

    在templates/admin/下创建模板useradd.html

    placeholder底部显示 

    1. {{ define "admin/useradd.html" }}
    2. html>
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    8. <title>Documenttitle>
    9. head>
    10. <body>
    11. <h2>----Gin Framek单文件上传测试----h2>
    12. <br>
    13. <br>
    14. <form action="/admin/user/fileUpload" method="post">form>
    15. <input type="text" name = "username" placeholder="用户名" />
    16. <br>
    17. <br>
    18. <input type="file" value="photo" placeholder="人物肖像" />
    19. <br> <br>
    20. <input type="submit" value="提交">
    21. body>
    22. html>
    23. {{ end }}

     2、控制器调整:

    1. package admin
    2. import (
    3. "net/http"
    4. "github.com/gin-gonic/gin"
    5. )
    6. type UserAddController struct {
    7. BaseController
    8. }
    9. func (con UserAddController) Index(c *gin.Context) {
    10. con.success(c)
    11. }
    12. func (con UserAddController) Add(c *gin.Context) {
    13. c.HTML(http.StatusOK ,"admin/useradd.html",gin.H{
    14. })
    15. }
    16. func (con UserAddController) Edit(c *gin.Context) {
    17. c.String(200, "用户列表-Edit------")
    18. }

    3、查看路由接入口:

    1. package routers
    2. import (
    3. "gindemo04/controllers/admin"
    4. "gindemo04/middle"
    5. "github.com/gin-gonic/gin"
    6. )
    7. func AdminRoutersInit(r *gin.Engine) {
    8. //middlewares.InitMiddleware中间件
    9. adminRouters := r.Group("/admin", middle.InitMiddleware)
    10. {
    11. adminRouters.GET("/", admin.IndexController{}.Index)
    12. adminRouters.GET("/user", admin.UserAddController{}.Index)
    13. adminRouters.GET("/user/add", admin.UserAddController{}.Add)
    14. adminRouters.GET("/user/edit", admin.UserAddController{}.Edit)
    15. }
    16. }

    4、展示页面测试:

    Documenticon-default.png?t=N7T8http://127.0.0.1:8210/admin/user/add

    点击提交之后,会转到之前模板渲染操作的action操作 

    而要实现文件的正确上传

    需要在上传文件的 form 表单上面需要加入 enctype="multipart/form-data"  

    点击提交后,转到在action内的路由操作,注意几则

    • 要在 表单内,不然跳转会出问题
    • 控制器内的方法需要大写首字母,不然成为私有方法,在路由内无法调用
    • 渲染的form后面需要加enctype="multipart/form-data
    • 一一对应,路由,控制器,渲染模板

    5、修改渲染的模板加入enctype

    1. {{ define "admin/useradd.html" }}
    2. html>
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    8. <title>FileUploadtesttitle>
    9. head>
    10. <body>
    11. <h2>----Gin Framek单文件上传测试----h2>
    12. <form action="/admin/user/fileUpload" method="post" enctype="multipart/form-data">
    13. 用户名:<input type="text" name="username" placeholder="用户名" />
    14. <br>
    15. <br>
    16. 人物像:<input type="file" name="photo" />
    17. <br> <br>
    18. <input type="submit" value="提交">
    19. form>
    20. body>
    21. html>
    22. {{ end }}

     6、添加对应的控制器方法

    7、路由操作调用方法

    1. package routers
    2. import (
    3. "gindemo04/controllers/admin"
    4. "gindemo04/middle"
    5. "github.com/gin-gonic/gin"
    6. )
    7. func AdminRoutersInit(r *gin.Engine) {
    8. //middlewares.InitMiddleware中间件
    9. adminRouters := r.Group("/admin", middle.InitMiddleware)
    10. {
    11. adminRouters.GET("/", admin.IndexController{}.Index)
    12. adminRouters.GET("/user", admin.UserAddController{}.Index)
    13. adminRouters.GET("/user/add", admin.UserAddController{}.Add)
    14. adminRouters.POST("/user/fileUpload", admin.UserAddController{}.FileUpload)
    15. }
    16. }

     8、测试从前端页面到POST服务拉取资源

    自动跳转(仅测试,接下来实现上传)

    9、真实上传操作(修改跳转的页面路由)

     在static目录下创建一个文件images

    以及修改后的控制器

    1. package admin
    2. import (
    3. "net/http"
    4. "path"
    5. "github.com/gin-gonic/gin"
    6. )
    7. type UserAddController struct {
    8. BaseController
    9. }
    10. func (con UserAddController) Index(c *gin.Context) {
    11. con.success(c)
    12. }
    13. func (con UserAddController) Add(c *gin.Context) {
    14. c.HTML(http.StatusOK, "admin/useradd.html", gin.H{})
    15. }
    16. func (con UserAddController) FileUpload(c *gin.Context) {
    17. username := c.PostForm("username")
    18. file, err := c.FormFile("photo")
    19. dest := path.Join("./static/images", file.Filename)
    20. if err == nil {
    21. c.SaveUploadedFile(file, dest)
    22. }
    23. c.JSON(http.StatusOK, gin.H{
    24. "success": true,
    25. "username": username,
    26. "dest": dest,
    27. })
    28. }

    10、测试文件上传

     

     有了一个图片

    多文件上传(上传的file名称不同的操作)

    1、修改渲染模板

    创建useredit的html文件

    1. {{ define "admin/useredit.html" }}
    2. html>
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    8. <title>FileUploadtesttitle>
    9. head>
    10. <body>
    11. <h2>----Gin Framek多文件上传测试(不同名称)----h2>
    12. <form action="/admin/user/fileEdit" method="post" enctype="multipart/form-data">
    13. 用户名:<input type="text" name="username" placeholder="用户名" />
    14. <br>
    15. <br>
    16. 人物像1:<input type="file" name="photo1" />
    17. <br>
    18. <br>
    19. 人物像2:<input type="file" name="photo2" />
    20. <br> <br>
    21. <input type="submit" value="提交">
    22. form>
    23. body>
    24. html>
    25. {{ end }}

     2、控制器调整

    1. package admin
    2. import (
    3. "net/http"
    4. "path"
    5. "github.com/gin-gonic/gin"
    6. )
    7. type UserAddController struct {
    8. BaseController
    9. }
    10. func (con UserAddController) Index(c *gin.Context) {
    11. con.success(c)
    12. }
    13. func (con UserAddController) Add(c *gin.Context) {
    14. c.HTML(http.StatusOK, "admin/useradd.html", gin.H{})
    15. }
    16. func (con UserAddController) FileUpload(c *gin.Context) {
    17. username := c.PostForm("username")
    18. file, err := c.FormFile("photo")
    19. dest := path.Join("./static/images", file.Filename)
    20. if err == nil {
    21. c.SaveUploadedFile(file, dest)
    22. }
    23. c.JSON(http.StatusOK, gin.H{
    24. "success": true,
    25. "username": username,
    26. "dest": dest,
    27. })
    28. }
    29. func (con UserAddController) Edit(c *gin.Context) {
    30. c.HTML(http.StatusOK, "admin/useredit.html", gin.H{})
    31. }
    32. func (con UserAddController) FileEdit(c *gin.Context) {
    33. username := c.PostForm("username")
    34. file1, err1 := c.FormFile("photo1")
    35. dest1 := path.Join("./static/images", file1.Filename)
    36. if err1 == nil {
    37. c.SaveUploadedFile(file1, dest1)
    38. }
    39. file2, err2 := c.FormFile("photo2")
    40. dest2 := path.Join("./static/images", file2.Filename)
    41. if err2 == nil {
    42. c.SaveUploadedFile(file2, dest2)
    43. }
    44. c.JSON(http.StatusOK, gin.H{
    45. "success": true,
    46. "username": username,
    47. "dest1": dest1,
    48. "dest2": dest2,
    49. })
    50. }

     3、路由接口配置

    1. package routers
    2. import (
    3. "gindemo04/controllers/admin"
    4. "gindemo04/middle"
    5. "github.com/gin-gonic/gin"
    6. )
    7. func AdminRoutersInit(r *gin.Engine) {
    8. //middlewares.InitMiddleware中间件
    9. adminRouters := r.Group("/admin", middle.InitMiddleware)
    10. {
    11. adminRouters.GET("/", admin.IndexController{}.Index)
    12. adminRouters.GET("/user", admin.UserAddController{}.Index)
    13. adminRouters.GET("/user/add", admin.UserAddController{}.Add)
    14. adminRouters.POST("/user/fileUpload", admin.UserAddController{}.FileUpload)
    15. adminRouters.POST("/user/fileEdit", admin.UserAddController{}.FileEdit)
    16. adminRouters.GET("/user/edit", admin.UserAddController{}.Edit)
    17. adminRouters.GET("/article", admin.ArticleController{}.Index)
    18. adminRouters.GET("/article/add", admin.ArticleController{}.Add)
    19. adminRouters.GET("/article/edit", admin.ArticleController{}.Edit)
    20. }
    21. }

    4、进行测试

     

     多文件上传(上传的file名称相同的操作)

    1、修改渲染模板

    1. {{ define "admin/useradd.html" }}
    2. html>
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    8. <title>FileUploadtesttitle>
    9. head>
    10. <body>
    11. <h2>----Gin Framek单文件上传测试----h2>
    12. <form action="/admin/user/fileUpload" method="post" enctype="multipart/form-data">
    13. 用户名:<input type="text" name="username" placeholder="用户名" />
    14. <br>
    15. <br>
    16. 人物像1:<input type="file" name="photo[]" />
    17. <br> <br>
    18. 人物像2:<input type="file" name="photo[]" />
    19. <br> <br>
    20. <input type="submit" value="提交">
    21. form>
    22. body>
    23. html>
    24. {{ end }}

     2、控制器调整

    MultipartForm是经过解析的多部分表单,包括文件上传。

    1. package admin
    2. import (
    3. "net/http"
    4. "path"
    5. "github.com/gin-gonic/gin"
    6. )
    7. type UserAddController struct {
    8. BaseController
    9. }
    10. func (con UserAddController) Index(c *gin.Context) {
    11. con.success(c)
    12. }
    13. func (con UserAddController) Add(c *gin.Context) {
    14. c.HTML(http.StatusOK, "admin/useradd.html", gin.H{})
    15. }
    16. func (con UserAddController) FileUpload(c *gin.Context) {
    17. username := c.PostForm("username")
    18. form,_ := c.MultipartForm()
    19. files := form.File["photo[]"]
    20. for _,file := range files{
    21. dest := path.Join("./static/images", file.Filename)
    22. c.SaveUploadedFile(file, dest)
    23. }
    24. c.JSON(http.StatusOK, gin.H{
    25. "success": true,
    26. "username": username,
    27. })
    28. }

     3、路由接口配置

     4、测试

     

     

  • 相关阅读:
    Android:Navigation使用safe args插件传递参数
    数据类型扩展02
    《C++》继承
    【微信小程序】父子组件的创建、通信与事件触发;组件生命周期
    CV计算机视觉每日开源代码Paper with code速览-2023.10.16
    LeetCode每日一题——1758. 生成交替二进制字符串的最少操作数
    CentOS与Xshell,开启ssh协议sshd服务远程控制
    gpu cuda矩阵转置
    面试官:MyBatis批量插入的五种方式,哪种最强?
    kubectl别名配置
  • 原文地址:https://blog.csdn.net/m0_72264240/article/details/132875833