首页 > 其他分享 >Gin文件上传

Gin文件上传

时间:2023-02-21 17:13:04浏览次数:40  
标签:文件 分片 gin router Gin 上传

Gin官方

官方给出了单文件与多文件的上传方式,也就是其实gin自己就实现了文件上传的功能,只不过看下来好像只能上传到本地,转发到别的服务器的话需要自己再加一些实现,并不是很难。

单文件

参考 issue #774 和详细示例代码.

func main() {
	router := gin.Default()
	// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)
	router.MaxMultipartMemory = 8 << 20  // 8 MiB
	router.POST("/upload", func(c *gin.Context) {
		// 单文件
		file, _ := c.FormFile("file")
		log.Println(file.Filename)

		dst := "./" + file.Filename
		// 上传文件至指定的完整文件路径
		c.SaveUploadedFile(file, dst)

		c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))
	})
	router.Run(":8080")
}

多文件

查看详细示例代码.

func main() {
	router := gin.Default()
	// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)
	router.MaxMultipartMemory = 8 << 20  // 8 MiB
	router.POST("/upload", func(c *gin.Context) {
		// Multipart form
		form, _ := c.MultipartForm()
		files := form.File["upload[]"]

		for _, file := range files {
			log.Println(file.Filename)

			// 上传文件至指定目录
			c.SaveUploadedFile(file, dst)
		}
		c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
	})
	router.Run(":8080")
}

Gin的文件上传相关的其他特性

限制文件大小

Gin 除了提供上面的文件上传功能,还有提供限制文件上传大小的功能,这个在实际项目中会有较大的用途。

router := gin.Default()
router.MaxMultipartMemory = 8 << 20

使用 MaxMultipartMemory 来配置文件上传的大小限制,默认是32M。

文件下载服务

虽然 go 默认提供了文件服务,但是默认的文件服务会把整个文件夹下所有的文件都暴露,如果我们想做更多的控制就不太方便了,而 Gin 提供了文件下载的服务

func main() {
    router := gin.Default()

    router.GET("/local/file", func(c *gin.Context) {
        c.File("local/file.go")
    })
}

Gin 提供的文件服务,可以让我们非常方便的进行控制,甚至是动态文件,比默认的有更多的定制化玩法

大文件上传

这个是我从网上找'Gin 大文件传输'的时候,在一个论坛中找到的。网上大部分是前后端联调,协商一个分片,用来分片传输大数据参考链接。然而论坛中说到:

其实完全不需要担心,net/http 在 readForm 的时候如果文件超过指定的最大内存占用,会自动写入临时文件,所以根本不会占用太多内存

https://github.com/golang/go/blob/master/src/mime/multipart/formdata.go#L91

我去查看了Gin读取文件相关的源码,发现底层确实就是调用readForm。也就是说完全不存在大文件撑爆内存的情况。

顺便去查看了一系列的Gin关于读取http.Request的实现的博客,对于Request的读取是这么说的:

我们可以知道该函数会将请求体中的数据解析为 multipart/form-data,并且请求体中数据最大为 maxMemory 个字节,还说文件部分存储于内存中,另外部分存储于磁盘中,不过这些都与我们的 URL 编码表单无关,唯一有关的,只是简单的一句,如果需要会调用 ParseForm

也就是Gin原生读取方式就可以支持大文件传输,并且前端并不需要做分片,以form的方式提交即可

网上的选择

自定义分片上传

需要前后端协商一个分片,用来分片传输大数据

具体的做法是前端将上传的文件进行分片,并给每个文件进行标号,之后分片发送Post。后端收到请求后进行校验与拼接。

参考链接

书栈网的实现

观察书栈网的源码实现发现,他就是使用的Gin的原生FormFile读取,之后通过io.Copy保存。也就是Gin官方的做法。

总结

个人认为Gin已经把文件上传这部分做的很优秀了,如果没有更好的实现方式应该就会采用Gin原生文件上传方式。不过还是需要取舍存储在本地还是需要存储在云服务上。

标签:文件,分片,gin,router,Gin,上传
From: https://www.cnblogs.com/Vikyanite/p/17141666.html

相关文章

  • 使用autoIt 上传文件(参数化)
    1.编写autoit脚本:upload.au3ControlFocus("打开","","Edit1");用于识别windwos窗口WinWait("[CLASS:#32770]","",3);等待窗口显示ControlSetText("打开","","E......
  • 碎片化学习前端之webpack(plugin)
    Plugin原理Plugin的作用通过插件我们可以扩展webpack,加入自定义的构建行为,使webpack可以执行更广泛的任务,拥有更强的构建能力。Plugin工作原理webpack就像一条......
  • QFileDialog -文件对话框
    QFileDialog继承了QDialog,具有父类的各种方法。QFileDialog提供了一个对话框,允许用户选择文件或者目录,也允许用户遍历文件系统,用以选择一个或多个文件或者目录。常用方法......
  • k8s之keepalive+nginx高可用集群部署
    1、安装nginx、keepalivedyuminstallnginxkeepalived-y2、更新nginx配置文件stream{log_formatmain'$remote_addr$upstream_addr-[$time_local]$status$up......
  • 如何将多张CAD图纸合并成一个图纸文件?
    在CAD设计过程中,有些时候会需要将多张CAD图纸合并成一个图纸文件,可有些新手设计师对此并不了解,所以接下来的CAD教程小编将会以浩辰CAD软件为例来给大家分享一下将多张CAD图......
  • minio设置文件访问策略
    1、设置AccessPolicy为public通过访问主机地址+文件的方式:​​http://x.x.x.x:9000/bucket/xxx.jpg​​此时的规则是2、通过MC设置存储桶或路径策略为download必须通过min......
  • Nginx系列---【配置文件中静态资源文件禁止通过目录查看】
    配置文件中静态资源文件禁止通过目录查看1.问题nginx作为文件服务器时,默认是可以通过目录路径查看该目录下的所有文件的,这样很不安全,容易造成静态资源泄露。2.方案lo......
  • ArcGIS Pro SDK 002 对数据文件的读取和操作
    做系统开发或者数据处理的时候,我一般还是喜欢使用文件数据源,例如矢量用.shp文件存储,栅格数据用.tif或者.img文件存储。ArcGISProSDK中对数据源操作的API和ArcObjectsSDK......
  • TS声明文件
    1.什么是声明当使用第三方库时,很多三方库不是用TS写的,我们需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能。比如,在TS中直接使用Vue,就会报错,consta......
  • MyBatis中mapper文件的常用标签
    <sql>标签:用来封装sql语句或者复用语句的,然后用<include>标签来调用<sqlid="selectFields">stuid,stuname,stuclass,stuage</sql><selectid="selectStudentByNam......