[Go] 建立下載檔案的 Http Response
從 .NET 轉來 GO 後,很多 API 的用法都要重新學習,今天就來熟悉如何使用 GO 來建立下載檔案的 Response。
設定 Header
以檔案下載的來說,我們有 3 個重要的 header 要設定。
Content-Type
這是用來告訴瀏覽器,回傳的檔案是什麼。 例如,是 jpeg 圖片的話,要設為 Content-Type: image/jpeg
。 而 Go 有 http.DetectContentType 可以用來判斷回傳的檔案是哪一種 Content-Type 。
這不一定要設定,使用 http.ServeContent 或 http.ServeFile 的話,會自動幫你設定好。
Content-Disposition
我們要用這個 Header 來告訴瀏覽器,我回傳的是一個檔案,例如 Content-Disposition: attachment; filename="filename.pdf
。
以 Chrome 來說,當 Content-Disposition: attachment
設定之後,瀏覽器才會執行下載,否則他會在新的 tab 開啟檔案。
Content-Length
這個 Header 是告訴瀏覽器檔案的大小,例如 content-length: 54138
這不一定要設定,使用 http.ServeContent 或 http.ServeFile 的話,會自動幫你設定好。
讀取檔案
讀取檔案的話我們要用的是 ioutil.ReadFile,讀取完檔案後,此 API 會回傳 byte[]。
傳送 Response
我們要使用到的是 http.ServeContent 這個 API,這會將我們設定好的 Header 以及 byte[] 的資料寫入 Response 並回應給瀏覽器。 http.ServeContent 適合用在當你只能拿到 byte[] 的資料時候使用,如果你能夠明確指定檔案路徑的話,可以使用 http.ServeFile。
請參考下方的範例程式碼,當使用者存取 http://localhost:8000/download 的時候,就會下載 test.pdf 的檔案了。
- go
1 | package main |
另一種回應檔案的方式
Go 還有提供另一個 http.ServeFile API,只要傳入檔案路徑,就會幫我們回傳檔案了,這個 API 比 http.ServeContent 簡單許多。
- go
1 | package main |
延伸閱讀
[HTTP File Upload and Download with Go]
[Golang : Force download file example]
[Downloading large files in Go]