Go嘗試解決前端下載服務器靜態文件問題

最近有個需求是將數據導出成指定格式的文件,瀏覽器下載生成的文件,一般直接返回服務器靜態文件地址,前端使用<a>標籤經過屬性href指向地址就能夠下載,可是有些特殊格式的文件瀏覽器會默認打開而不是下載,好比.xes(xml的一種拓展)還有png等圖片格式。下面是總結了一些解決的方法。javascript

因爲存在文件較大的狀況,因此沒有寫用流的方式傳遞給前端。html

使用<a>標籤的download屬性

<a>標籤的 dowanload 屬性只有在同源狀況下在能用,且目前只支持 火狐瀏覽器和谷歌瀏覽器 前端

<a>標籤中必須設置 href 屬性。 download 屬性規定被下載的超連接目標。 該屬性也能夠設置一個值來規定下載文件的名稱。所容許的值沒有限制,瀏覽器將自動檢測正確的文件擴展名並添加到文件 (.img, .pdf, .txt, .html, 等等)。java

// 請將href中的地址改成文件地址,下載下來的文件名稱爲 ceshi
<a href="www.baidu.com" download="ceshi">
複製代碼

Iris框架的 ctx.SendFile()方法

iris框架中有封裝方法 ctx.SendFile()方法能夠將文件的內容返還給前端。(ps:若是文件特別大的話,內容不少感受仍是不方便)git

SendFile(filename string, destinationName string) error
複製代碼

兩個參數,filename是目標文件路徑,destinationName 是賦予文件名github

/* 文件目錄爲 — 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
}
複製代碼

以上三種方法是通過百度和本身理解總結的方法,若有不對請大佬指正,若是有其餘更好的方法請賜教 :)服務器

相關文章
相關標籤/搜索