Golang Gin框架HTTP上传文件

这篇具有很好参考价值的文章主要介绍了Golang Gin框架HTTP上传文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Golang Gin框架HTTP上传文件解析

HTTP上传的文件的原理

HTTP协议的文件上传是通过HTTP POST请求实现的,使用multipart/form-data格式将待上传的文件放入请求体中。

服务器根据请求头中的boundary参数来解析请求体,并根据Content-Disposition字段获取文件名等信息,根据Content-Type字段判断文件类型并保存到相应位置。

Gin框架文件上传Demo

代码逻辑:

  1. 通过Gin框架封装的Form表单获取数据,获取上传文件
  2. 获取文件名,并创建新的文件存储
  3. 将上传的文件内容写入新的文件
  4. 返回上传成功信息
package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
	"net/http"
	"os"
)

func uploadFile(c *gin.Context) {
	//form表单
	file, header, err := c.Request.FormFile("upload")
	if err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("上传文件失败: %s", err.Error()))
		return
	}
	// 获取文件名,并创建新的文件存储
	filename := header.Filename
	out, err := os.Create(filename)
	if err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("创建文件: %s", err.Error()))
		return
	}

	defer out.Close()
	//将读取的文件流写到文件中
	_, err = io.Copy(out, file)
	if err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("读取文件失败: %s", err.Error()))
		return
	}

	c.String(http.StatusCreated, "上传成功 \n")
}

func main() {
	router := gin.Default()
	//路由:http://localhost:8080/upload
	router.POST("/upload", uploadFile)
	router.Run(":8080")
}

限制文件上传的大小

使用 http.MaxBytesReader() 函数来限制 HTTP 请求中读取的最大字节数。这个函数会返回一个新的 Reader 对象,该对象会在读取请求的正文时自动检查字节数,如果超过指定的最大字节数,则会自动停止读取,返回错误。

//限制大小为2M
c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, int64(2<<20))
	file, header, err := c.Request.FormFile("upload")
	if err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("上传文件失败: %s", err.Error()))
		return
	}

该代码不能限制文件上传大小,只是设置内存大小,即使文件大小比这个大,也会写入临时文件

router := gin.Default()
router.MaxMultipartMemory = 2 * 1024 //2M Byte,默认32M

运行结果截图

gin 文件上传,golang,gin

文件类型验证

验证上传的文件类型,以确保上传的文件是我们期望的类型,借助“github.com/h2non/filetype”实现对文件类型的判断

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/h2non/filetype"
	"io"
	"net/http"
)
func uploadFile(c *gin.Context) {
	//form表单
	c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, int64(2<<20))
	file, _, err := c.Request.FormFile("upload")
	if err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("上传文件失败: %s", err.Error()))
		return
	}
	content, err := io.ReadAll(file)
	if err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("读取失败: %s", err.Error()))
		return
	}
	// 解析文件类型
	kind, err := filetype.Match(content)
	if err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("文件类型判断失败: %s", err.Error()))
		return
	}
	fmt.Println(kind)
	// 验证文件类型
	if kind == filetype.Unknown {
		c.String(http.StatusCreated, "未知类型 \n")
        return
	}
	if filetype.IsImage(content) {
		c.String(http.StatusCreated, "图片 上传成功 \n")
		return
	}
	c.String(http.StatusCreated, "上传成功 \n")
}

gin 文件上传,golang,gin

文件上传进度-后台计算文件上传进度

实现原理:

要实现 Gin 框架中的文件上传进度,在文件上传中,计算已上传的字节数,并将其与文件的总大小进行比较,以确定上传的进度。文章来源地址https://www.toymoban.com/news/detail-752328.html

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"
)


func uploadFile(c *gin.Context) {
	//form表单
	//c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, int64(2<<20))
	file, fileHeader, err := c.Request.FormFile("upload")
	if err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("上传文件失败: %s", err.Error()))
		return
	}

	filename := fileHeader.Filename
	out, err := os.Create(filename)
	if err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("创建文件: %s", err.Error()))
		return
	}

	defer out.Close()
	count := 0
	for {
		buf := make([]byte, 10000)
		n, err := file.Read(buf)
		if err != nil {
			c.String(http.StatusBadRequest, fmt.Sprintf("读取失败: %s", err.Error()))
			return
		}
		if n == 0 {
			break
		}
		count = count + n
		out.Write(buf)
		fmt.Println(count, float64(fileHeader.Size))
		progress := float64(count) / float64(fileHeader.Size) * 100
		fmt.Println(fmt.Sprintf("%.2f%%", progress))
	}

	c.String(http.StatusCreated, "上传成功 \n")
}

func main() {
	router := gin.Default()
	router.MaxMultipartMemory = 2 * 1024 //2M Byte,默认32M

	//路由:http://localhost:8080/upload
	router.POST("/upload", uploadFile)
	fmt.Println(router.MaxMultipartMemory)
	router.Run(":8080")
}


到了这里,关于Golang Gin框架HTTP上传文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【golang】Windows环境下Gin框架安装和配置

    我终于搞定了Gin框架的安装,花了两三个小时,只能说道阻且长,所以写下这篇记录文章 先需要修改一些变量,这就需要打开终端,为了一次奏效,我们直接设置全局的: 首先创建一个项目 进去之后先创建go.mod文件,创建完之后通常会为你自动配置参数 然后我们打开Files

    2024年02月07日
    浏览(50)
  • [golang gin框架] 40.Gin商城项目-微服务实战之Captcha验证码微服务

    本次内容需要 gin框架基础知识, golang微服务基础知识才能更好理解 在前面,讲解了微服务的架构等,这里,来讲解前面商城项目的 Captcha验证码 微服务 ,captcha验证码功能在前台,后端 都要用到 ,可以把它 抽离出来 ,做成微服务功能 编辑 这个验证码功能封装代码captcha.go如下: 把这个

    2024年02月16日
    浏览(44)
  • [golang gin框架] 38.Gin操作Elasticsearch创建索引、修改映射、数据CURD以及数据分页

    常见的 Golang 操作 ElasticSearch 的插件主要有下面两个: 第三方插件: github.com/olivere/elastic 官网插件 github.com/elastic/go-elasticsearch 其中 elastic 比 go-elasticsearch 文档更全面一些,start 量也更多一些,本节讲解 elastic 使用第三方库 https://github.com/olivere/elastic 来连接 ES 并进行操作 注意

    2024年02月09日
    浏览(63)
  • [golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

    ElasticSearch 是一个基于 Lucene 的 搜索服务器 ,它提供了一个 分布式多用户 能力的 全文搜索引擎 ,基于 RESTful web 接口,Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎,设计用于云计算中,能够达到 实时搜索 , 稳定 , 可靠

    2024年02月11日
    浏览(58)
  • Golang Gin 接口返回 Excel 文件

    Web 页面导出表数据到 Excel(或其他格式)可以由前端或后台来实现,具体的实现方式取决于你的应用需求和架构。以下是一些考虑因素: (1)前端实现。 如果你的数据导出不涉及复杂的数据处理、数据权限控制或数据来源的保护,你可以考虑在前端实现数据导出。 前端实

    2024年02月06日
    浏览(43)
  • [golang gin框架] 45.Gin商城项目-微服务实战之后台Rbac微服务之角色权限关联

    角色和权限的关联关系在前面文章中有讲解,见[golang gin框架] 14.Gin 商城项目-RBAC管理之角色和权限关联,角色授权,在这里通过微服务来实现 角色对权限的授权 操作,这里要实现的有两个功能,一个是进入授权,另一个是,授权提交操作,页面如下:  这里需要在proto/rbacRole.proto中增加

    2024年02月14日
    浏览(57)
  • [golang gin框架] 26.Gin 商城项目-前台自定义商品列表模板, 商品详情数据渲染,Markdown语法使用

    当在首页分类点击进入分类商品列表页面时,可以根据后台分类中的分类模板跳转到对应的模板商品列表页面 (1).商品控制器方法Category()完善 修改controllers/frontend/productController.go中的方法Category(), 判断分类模板,如果后台没有设置,则使用默认模板 (2).模板页面案例 先来回顾一

    2024年02月01日
    浏览(55)
  • [golang gin框架] 42.Gin商城项目-微服务实战之后台Rbac微服务角色增删改查微服务

    上一节讲解了后台Rbac微服务用户登录功能以及Gorm数据库配置单独抽离,Consul配置单独抽离,这一节讲解 后台Rbac微服务 角色 增删改查微服务 功能,Rbac微服务角色增删改查微服务和 后 台Rbac用户登录微服务 是属于 同一个Rbac微服务 的 不同子微服务功能 ,为了区分不同子微

    2024年02月15日
    浏览(40)
  • [golang gin框架] 44.Gin商城项目-微服务实战之后台Rbac微服务之权限的增删改查微服务

    上一节讲解了[golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联,这里讲解权限管理Rbac微服务权限的增删改查微服务 要实现权限的增删改查,就需要创建对应的模型,故在server/rbac/models下创建Access.go模型文件,参考[golang gin框架]

    2024年02月14日
    浏览(43)
  • [golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联

    上一节讲解了后台Rbac微服务角色增删改查微服务,这里讲解权限管理Rbac微服务管理员的增删改查微服务以及管理员和角色关联微服务功能 要实现管理员的增删改查,就需要创建对应的模型,故在server/rbac/models下创建manager.go模型文件,参考[golang gin框架] 14.Gin 商城项目-RBAC管理代码

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包