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

【Go】--文件上传

【Go】-- Gin框架文件上传

核心特性

  • 单文件上传:处理单个文件上传请求
  • 多文件上传:处理多个文件同时上传
  • 文件验证:获取文件名、文件大小等信息
  • 文件保存:提供多种文件保存方式

单文件上传

核心代码

r.POST("/user", func(c *gin.Context) {// FormFile 方法会解析 multipart form 数据,包括文件上传fileheader, err := c.FormFile("file")if err != nil {c.JSON(500, gin.H{"msg": err.Error(),})return}// 获取文件名和文件大小c.JSON(200, gin.H{"文件名": fileheader.Filename,"文件大小": fileheader.Size,})// 保存文件c.SaveUploadedFile(fileheader, "images/"+fileheader.Filename)
})

关键API

  • c.FormFile("file"):获取单个上传文件
  • fileheader.Filename:获取原始文件名
  • fileheader.Size:获取文件大小(字节)
  • c.SaveUploadedFile():保存上传的文件

多文件上传

核心代码

r.POST("/user2", func(c *gin.Context) {// 获取整个表单form, err := c.MultipartForm()if err != nil {c.JSON(500, gin.H{"msg": err.Error(),})return}// 获取全部文件for key, fileheader := range form.File["file"] {// 打印文件名c.JSON(200, gin.H{"key": key,"文件名": fileheader.Filename,})c.SaveUploadedFile(fileheader, "images/"+fileheader.Filename)}
})

关键API

  • c.MultipartForm():获取完整的multipart表单数据
  • form.File["file"]:获取指定字段的所有文件
  • 循环处理:遍历处理每个上传的文件

文件保存方法

Gin框架提供了两种文件保存方式:

方法一:手动读取和保存

// 方法一:手动读取文件内容并保存
file, _ := fileheader.Open()
byteData, _ := io.ReadAll(file)
os.WriteFile(fileheader.Filename, byteData, 0644)

优点

  • 完全控制文件处理过程
  • 可以在保存前对文件内容进行处理

缺点

  • 代码相对复杂
  • 需要手动处理文件流

方法二:使用内置方法保存

// 方法二:使用内置方法保存
c.SaveUploadedFile(fileheader, "images/"+fileheader.Filename)

优点

  • 代码简洁,一行代码完成保存
  • 自动处理文件流和错误
  • 推荐使用的方式

缺点

  • 灵活性相对较低

完整代码示例

package mainimport ("github.com/gin-gonic/gin"
)func main() {gin.SetMode(gin.ReleaseMode)r := gin.Default()// 单文件上传接口r.POST("/user", func(c *gin.Context) {// FormFile 方法会解析 multipart form 数据,包括文件上传fileheader, err := c.FormFile("file")if err != nil {c.JSON(500, gin.H{"msg": err.Error(),})return}// 获取文件名和文件大小c.JSON(200, gin.H{"文件名": fileheader.Filename,"文件大小": fileheader.Size,})// 保存文件到images目录c.SaveUploadedFile(fileheader, "images/"+fileheader.Filename)})// 多文件上传接口r.POST("/user2", func(c *gin.Context) {// 获取整个表单form, err := c.MultipartForm()if err != nil {c.JSON(500, gin.H{"msg": err.Error(),})return}// 获取全部文件for key, fileheader := range form.File["file"] {// 打印文件名c.JSON(200, gin.H{"key": key,"文件名": fileheader.Filename,})// 保存每个文件c.SaveUploadedFile(fileheader, "images/"+fileheader.Filename)}})r.Run(":1234")
}

使用说明

1. 启动服务器

cd 5.文件上传/ginDemo
go run main.go

服务器将在 http://localhost:1234 启动

2. 单文件上传测试

使用Postman或curl测试单文件上传:

请求信息:

  • 方法:POST
  • URL:http://localhost:1234/user
  • Body类型:form-data
  • 参数:file(文件类型)

响应示例:

{"文件名": "example.jpg","文件大小": 102400
}

3. 多文件上传测试

请求信息:

  • 方法:POST
  • URL:http://localhost:1234/user2
  • Body类型:form-data
  • 参数:file(文件类型,可上传多个)

响应示例:

{"key": 0,"文件名": "file1.jpg"
}
{"key": 1,"文件名": "file2.png"
}
http://www.dtcms.com/a/499472.html

相关文章:

  • 基于SpringBoot及PostgreSQL的国家减肥食谱管理项目(中):食谱与菜单配置搭建
  • 网站建设 需要准备材料安徽六安特产有哪些
  • Qt的QT_QPA_EGLFS_INTEGRATION环境变量浅解
  • ppt设计网站有哪些银行管理系统网站建设
  • 矽塔 SA8209 输入耐压36V 8A过流保护阈值 过压过流保护芯片 SOT23
  • 【Trae】如何使用Trae编译C++(附带MinGW)
  • thinkpad t480 更换开机LOGO
  • 重庆网站建设就选承越做国外的众筹网站
  • Go基础知识(二)
  • Go小工具合集
  • Go 1.26 内置函数 new 新特性
  • 十堰微网站建设多少钱wordpress开头
  • Debian 的 网络管理器 被意外卸载,修复过程
  • 网站备案流程浏览器打不开网页是什么原因
  • Rust中字符串与格式化
  • Linux网络--6、网络层
  • 福州网站建设哪家专业怎么在自己的网站上推广业务
  • 数据结构——队列的顺序存储结构
  • Android Bootloader启动逻辑深度解析
  • 【机械臂运动学基础】变换矩阵
  • 购物网站开发意义大气广告设计网站源码 企业公司模板 dedecms5.7 企业网站
  • 包资源管理器NPM 使用
  • 在PHP框架里如何进行数据库连接?
  • 网站建设后压缩代码邢台又一地被划定高风险区域
  • 《彻底理解C语言指针全攻略(6)-- qsort、sizeof和strlen》
  • 网站开发的工资是多少wordpress 获取文章图片标题
  • C++ - List
  • 阿里服务器怎么做网站服务器上海网站制作公司介绍
  • MAC mini /绿联NAS 上安装本地AFFiNE
  • h5游戏免费下载:怪物联盟