Golang - Gin 上传/下载档案注意事项&Tips

工作需求每次都被上传/下载档案搞得很烦
每次用完然後每次就忘记
刚好发一篇整理起来,以後有机会可以用到
而且在不经意地翻文件时也发现一些小细节分享给各位

上传档案

https://github.com/gin-gonic/gin#upload-files 之中明确提到了
上传档案时不应该直接使用 file.Filename
在随後附上的 https://github.com/gin-gonic/gin/issues/1693https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#directives
内有解释
大意上是说在上传档案时的 Content-Disposition 携带的档案名
在没有问题的请况下,例如是 main.go
有问题的时候就会变成 User/ComputerName/go/src/main.go 等於直接被注入,把档案直接存到任何输入端想存的地方
同时也违背了服务器不能总是信任输入的资料,需要自己做验证

解决方法

在issue里有直接提到,利用filepath.Base只取路径上最後的档名,把前面的路径都去除掉,最後在储存
之前都没注意到这个地方...看到的时候突然抖了一下...好险有取元素出来变成服务器规则没有像案例直接存。

file, _ := c.FormFile("file")
filename := filepath.Base(file.Filename)
c.SaveUploadedFile(file, filename)

Content-Disposition 是什麽?

简单来说就是http header挟带的内容
下载/上传的时候header会带有这段内容,让浏览器解析

Content-Disposition: attachment; filename="filename.jpg"

其他详见

深入了解 multipart/form-data

简单的说 Content-Disposition 就是为了描述 multipart/form-data 里的请求是什麽格式
-https://www.jianshu.com/p/29e38bcc8a1d
-https://blog.kalan.dev/2021-03-13-html-form-data/

下载档案

gin里面提供三种方式,没什麽特别的
只是每次下关键字download都找不到,纪录一下

  • Serving static files
  • Serving data from file
  • Serving data from reader

参考资源


<<:  自己的hackmd自己架 - Codimd

>>:  整理程序中常见的时间复杂度

30天轻松学会unity自制游戏-制作Player

开启专案先开一个新场景,File->New Scene开启一个空场景,新场景选Basic有多一...

(特别篇)Documents-Delivered-Data,Data-DrivenDocuments—爬虫D3做成D3(上)

没有资料就没有燃料,没有燃料就变成废料—浅谈特别篇 标题取名的缘由一方面来自於d3JS的全名Data...

Anthos attach cluster

Anthos Attach Cluster (AAC) instruction Date: 2021...

Day05-CRUD API 实作(五)Route 规划与 CRUD 实作(上)

大家好~ 今天要来开始实作留言的 CRUD 了! Route // 查询全部 messages Ro...

#9 Web Crawler 2

We are going to start coding!! 想法 这个爬虫的想法很简单,对於每个 ...