IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> goland 通过http返回zip压缩文件 -> 正文阅读

[网络协议]goland 通过http返回zip压缩文件

需求背景:用户勾选多张图片进行下载,需要将多张图片打成一个zip包进行返回
参考:https://studygolang.com/articles/9659
上代码:

func DownloadFiles(c *ginserver.Context) (resp interface{}, e error) {
	//获取url中的参数:ids
	param := c.Query("ids")
	//类型转换,string转int
	array := strings.Split(param, ",")
	ids := make([]int, len(array))
	for i, str := range array {
		id, _ := strconv.Atoi(str)
		ids[i] = id
	}
	//获取当前时间作为新建的zip包名(固定写法)
	fileName := time.Now().Format("2006-01-02 15:04:05") + ".zip"
	//设置响应头
	c.Writer.Header().Add("Content-Disposition", "attachment; filename=\""+fileName+"\"")
	c.Writer.Header().Add("Content-Type", "application/zip")
	err := GetZip(c, c.Writer, ids)
	if err != nil {
		log.Fatal(err)
	}
	return
}
//获取zip流
func GetZip(ctx context.Context, rw io.Writer, ids []int) error {	
	//这里我是根据业务需求直接在库里进行查询的
	element := dao.Element{DB: config.DB.WithContext(ctx)}
	elements := make([]entity.Element, len(ids))
	elements, err := element.GetElementsByIds(ids)
	if len(elements) == 0 {
		return err
	}
	//在流中创建一个 zipwriter
	zipwriter := zip.NewWriter(rw)
	//关闭zipwriter
	defer zipwriter.Close()
	//循环写入图片
	for _, f := range elements {
		iowriter, err := zipwriter.Create(f.Name)
		if err != nil {
			return err
		}
		var content []byte
		resp, err := http.Get(f.Url)
		if err == nil {
			content, err = ioutil.ReadAll(resp.Body)
			if err != nil {
				content = []byte("")
			}
			resp.Body.Close()
		}
		iowriter.Write(content)
	}
	return nil
}

注意:
1.一般下载文件都会使用GET方法来请求,这个好像是跟前端有关系,具体的参见:http://ishare.iask.sina.com.cn/f/bsyG3SeC4EJ.html
2.设置响应头,这一步很关键,Content-Type可以根据具体的文件类型来进行选择,Content-Disposition于告知浏览器其获取到的文件是需要展示与页面内还是需要作为附件保存到用户本地,如果需要展示在页面内,设置为inline,否则设置为attachemn

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 17:07:55  更:2021-12-02 17:09:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:26:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码