1. 程式人生 > 程式設計 >Go嘗試解決前端下載伺服器靜態檔案問題

Go嘗試解決前端下載伺服器靜態檔案問題

最近有個需求是將資料匯出成指定格式的檔案,瀏覽器下載生成的檔案,通常直接返回伺服器靜態檔案地址,前端使用<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
}
複製程式碼

以上三種方法是經過百度和自己理解總結的方法,如有不對請大佬指正,如果有其他更好的方法請賜教 :)