最近有個需求是將數據導出成指定格式的文件,瀏覽器下載生成的文件,一般直接返回服務器靜態文件地址,前端使用<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()方法能夠將文件的內容返還給前端。(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
}
複製代碼
以上三種方法是通過百度和本身理解總結的方法,若有不對請大佬指正,若是有其餘更好的方法請賜教 :)服務器