Go尝试解决前端下载服务器静态文件问题

Tony乙 · · 2558 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近有个需求是将数据导出成指定格式的文件,浏览器下载生成的文件,通常直接返回服务器静态文件地址,前端使用<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
}
复制代码

以上三种方法是经过百度和自己理解总结的方法,如有不对请大佬指正,如果有其他更好的方法请赐教 :)


有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:Tony乙

查看原文:Go尝试解决前端下载服务器静态文件问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2558 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传