Go嘗試解決前端下載伺服器靜態檔案問題
阿新 • • 發佈:2019-12-31
最近有個需求是將資料匯出成指定格式的檔案,瀏覽器下載生成的檔案,通常直接返回伺服器靜態檔案地址,前端使用<a>
標籤通過屬性href
指向地址就可以下載,但是有些特殊格式的檔案瀏覽器會預設開啟而不是下載,比如.xes
(xml的一種拓展)還有png
等圖片格式。下面是總結了一些解決的方法。
由於存在檔案較大的情況,所以沒有寫用流的方式傳遞給前端。
使用<a>
標籤的download
屬性
<a>標籤的 dowanload 屬性只有在同源情況下在能用,且目前只支援 火狐瀏覽器和谷歌瀏覽器
在<a>
標籤中必須設定 href 屬性。
download 屬性規定被下載的超連結目標。
該屬性也可以設定一個值來規定下載檔案的名稱。所允許的值沒有限制,瀏覽器將自動檢測正確的副檔名並新增到檔案 (.img,.pdf,.txt,.html,等等)。
// 請將href中的地址改為檔案地址,下載下來的檔名稱為 ceshi
<a href="www.baidu.com" download="ceshi">
複製程式碼
Iris框架的 ctx.SendFile()方法
iris框架中有封裝方法 ctx.SendFile()方法可以將檔案的內容返還給前端。(ps:如果檔案特別大的話,內容很多感覺還是不方便)
SendFile(filename string,destinationName string) error
複製程式碼
兩個引數,filename是目標檔案路徑,destinationName 是賦予檔名
/* 檔案目錄為
— files
—— first.xml
—— main.go
*/
package main
import (
"github.com/kataras/iris"
)
func main() {
app := iris.New()
app.Get("/",func(ctx iris.Context) {
file := "./files/first.xml"
ctx.SendFile(file,"c.xml")
})
app.Run(iris.Addr(":8080"))
}
複製程式碼
壓縮指定檔案
可以將瀏覽器無法下載的檔案壓縮為.zip
格式檔案,然後將該.zip
檔案返還給瀏覽器,瀏覽器再進行下載。本人採用的就是這種方法
/* 壓縮檔案為zip格式
* filePath 為需要壓縮的檔案路徑,zipPath為壓縮後檔案路徑
*/
func FileToZip(filePath string,zipPath string) error {
f,err := os.Open(filePath)
if err !=nil{
return err
}
defer f.Close()
z,err := os.Create(zipPath)
if err !=nil{
return err
}
defer z.Close()
wr := zip.NewWriter(z)
// 因為filePath是一個路徑,所以會建立路徑中的所有資料夾
w,err := wr.Create(filePath)
if err != nil{
return err
}
_,err = io.Copy(w,f)
if err != nil{
return err
}
return nil
}
複製程式碼
以上三種方法是經過百度和自己理解總結的方法,如有不對請大佬指正,如果有其他更好的方法請賜教 :)