工作需求每次都被上傳/下載檔案搞得很煩
每次用完然後每次就忘記
剛好發一篇整理起來,以後有機會可以用到
而且在不經意地翻文件時也發現一些小細節分享給各位
在 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)
簡單來說就是http header挾帶的內容
下載/上傳的時候header會帶有這段內容,讓瀏覽器解析
Content-Disposition: attachment; filename="filename.jpg"
其他詳見
簡單的說 Content-Disposition 就是為了描述 multipart/form-data 裡的請求是什麼格式
-https://www.jianshu.com/p/29e38bcc8a1d
-https://blog.kalan.dev/2021-03-13-html-form-data/
gin裡面提供三種方式,沒什麼特別的
只是每次下關鍵字download都找不到,紀錄一下