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

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

上传档案

在 https://github.com/gin-gonic/gin#upload-files 之中明确提到了
上传档案时不应该直接使用 file.Filename
在随后附上的 https://github.com/gin-gonic/gin/issues/1693 与 https://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"

其他详见

https://cloud.tencent.com/developer/section/1189916https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition

深入暸解 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 filesServing data from fileServing data from reader

参考资源

https://github.com/gin-gonic/gin#upload-fileshttps://github.com/gin-gonic/gin/issues/1693https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#directiveshttps://cloud.tencent.com/developer/section/1189916https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Dispositionhttps://www.jianshu.com/p/29e38bcc8a1dhttps://blog.kalan.dev/2021-03-13-html-form-data/

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章