iT邦幫忙

1

Golang - Gin 上傳/下載檔案注意事項&Tips

  • 分享至 

  • xImage
  •  

工作需求每次都被上傳/下載檔案搞得很煩
每次用完然後每次就忘記
剛好發一篇整理起來,以後有機會可以用到
而且在不經意地翻文件時也發現一些小細節分享給各位

上傳檔案

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

參考資源


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言