龙空技术网

Go系列10:gin 参数绑定 单个多个 文件上传 图片上传大法

开悟觉醒中 130

前言:

如今各位老铁们对“form表单上传多个图片”大约比较着重,大家都需要了解一些“form表单上传多个图片”的相关资讯。那么小编在网络上汇集了一些对于“form表单上传多个图片””的相关内容,希望咱们能喜欢,同学们快快来了解一下吧!

Http 文件上传 ,或者图片上传 原理浏览器网页前端单个文件上传多个文件上传gin post form参数绑定

Http 文件上传 ,或者图片上传 原理

通过form Http Post 协议 multipart/form-data 上传文件


浏览器网页前端



Go 后端

我采用的Go 开发工具为Vscode 强烈推荐,并加上相关的Go插件。非常好用。 goland也是非常棒的开发工具,但是要正版,费用。 vscode是微软开源的工具已经完全够用,而且轻量级,系统要求极低。


工程文件结构


public 是开放 http 的 / 根目录。 当访问 的时候的Home网页浏览器前端的静态资源映射

a

单个文件上传前端 html


单个文件或者图片上传的时候 input type= "file" name="file"

action , method=post, enctype="multipart/form-data"

当用户点击submit 按钮的时候会向 发送一个post form表单的请求


后端go

package main

import (

"fmt"

"net/http"

"path/filepath"

"github.com/gin-gonic/gin"

)

func main() {

router := gin.Default()

// Set a lower memory limit for multipart forms (default is 32 MiB)

router.MaxMultipartMemory = 8 << 20 // 8 MiB

router.Static("/", "./public")

router.POST("/upload", func(c *gin.Context) {

name := c.PostForm("name")

email := c.PostForm("email")

// Source

file, err := c.FormFile("file")

if err != nil {

c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))

return

}

filename := filepath.Base(file.Filename)

if err := c.SaveUploadedFile(file, filename); err != nil {

c.String(http.StatusBadRequest, fmt.Sprintf("upload file err: %s", err.Error()))

return

}

c.String(http.StatusOK, fmt.Sprintf("File %s uploaded successfully with fields name=%s and email=%s.", file.Filename, name, email))

})

router.Run(":8080")

gin 参数绑定通过

name := c.PostForm("name")

获取name参数。

file, err := c.FormFile("file") 获取文件

filename := filepath.Base(file.Filename) 获取文件名称

然后保存在后端服务器


Gin 后端启动界面



多个文件上传前端页面

<!doctype html>

<html lang="en">

<head>

<meta charset="utf-8">

<title>Multiple file upload</title>

</head>

<body>

<h1>Upload multiple files with fields</h1>

<form action="/upload" method="post" enctype="multipart/form-data">

Name: <input type="text" name="name"><br>

Files: <input type="file" name="files" multiple><br><br>

<input type="submit" value="Submit">

</form>

</body>

</html>

选择多个文件


go 后端 代码

package main

import (

"fmt"

"net/http"

"path/filepath"

"strings"

"github.com/gin-gonic/gin"

)

func main() {

router := gin.Default()

// Set a lower memory limit for multipart forms (default is 32 MiB)

router.MaxMultipartMemory = 8 << 20 // 8 MiB

router.Static("/", "./public")

router.POST("/upload", func(c *gin.Context) {

name := c.PostForm("name")

// email := c.PostForm("email")

// Multipart form

form, err := c.MultipartForm()

if err != nil {

c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))

return

}

files := form.File["files"]

fnames := make([]string, 0)

for _, file := range files {

filename := filepath.Base(file.Filename)

if err := c.SaveUploadedFile(file, filename); err != nil {

c.String(http.StatusBadRequest, fmt.Sprintf("upload file err: %s", err.Error()))

return

}

fnames = append(fnames, filename)

}

c.String(http.StatusOK, fmt.Sprintf("Uploaded successfully %d files with fields name=%s and email=%s.", len(files), name, strings.Join(fnames, ",")))

})

router.Run(":8080")

}

form, err := c.MultipartForm()

files := form.File["files"]

for _, file := range files {

filename := filepath.Base(file.Filename)

}

通过循环获得多个上传的文件名

调用成功Gin 界面

当用户选择多个文件上传后,将获得文件列表。循环操作


标签: #form表单上传多个图片