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