首页 > 其他分享 >golang+gin+download

golang+gin+download

时间:2022-12-13 09:57:45浏览次数:32  
标签:WriteString Writer ctx golang gzip download gin

// main.go
package main

import (
	"fmt"
	"log"
	"time"

	"github.com/gin-contrib/gzip"
	"github.com/gin-gonic/gin"
)

func useGzip(engine *gin.Engine) {
	engine.Use(gzip.Gzip(gzip.DefaultCompression))
}

func main() {
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	engine := gin.New()
	// engine.Use(gzip.Gzip(gzip.DefaultCompression))  //如果需要开启gzip压缩,取消这一行的注释
	engine.Handle("POST", "/query", downloadFile)
	engine.Handle("GET", "/", homepage)
	engine.Run(":8080")
}

func downloadFile(ctx *gin.Context) {
	reqData, has := ctx.GetPostForm("json")
	if !has {
		ctx.Data(400, "text/plain","not found json form data")
		return
	}
        // 此处省略查询的业务逻辑
        //  todo: 
	// 下面开始下载的准备
	ctx.Writer.WriteHeader(200)
	ctx.Header("Content-Type", "text/plain; charset=utf-8")
	ctx.Header("Transfer-Encoding", "chunked")  // 告诉浏览器,分段的流式的输出数据
	//   ctx.Header("Content-Encoding", "gzip") // 输出不是gzip内容,又加上这个头,浏览器会拒收。这里是个实验,不要加这行代码
	now := time.Now()
	fileName := now.Format("20060102_150405.csv")
	ctx.Header("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", fileName))  // 设置下载的文件名
	ctx.Writer.WriteHeaderNow()
	// 下面模拟一个周期非常长的数据处理和下载过程
	for i := 0; i < 100; i++ {
		ctx.Writer.WriteString("\"")
		ctx.Writer.WriteString(str)
		ctx.Writer.WriteString("\"\t")
		ctx.Writer.WriteString("\"")
		ctx.Writer.WriteString(time.Now().Format("2006-01-02 15:04:05"))
		ctx.Writer.WriteString("\"\n")
		ctx.Writer.Flush()  // 产生一定的数据后, flush到浏览器端
		time.Sleep(time.Duration(500) * time.Millisecond)
	}
}

func homepage(ctx *gin.Context) {
	ctx.Header("Content-Type", "text/html")
	ctx.Writer.WriteString(`
<html>
<body>
open window and to download:
<a href="javascript:download()">download</a>
<script>
function download(){
    var handle = window.open("about:blank", "my_download_window");
	document.forms[0].target = "my_download_window";
	document.forms[0].json.value="ahfu test";
	document.forms[0].submit();
}
</script>
<form action="/query" method="POST" enctype="multipart/form-data">
<input type="hidden" name="json" value=""/>
</form>
</body>
</html>
`)
}

  

标签:WriteString,Writer,ctx,golang,gzip,download,gin
From: https://www.cnblogs.com/lqq2314/p/16977757.html

相关文章

  • Nginx
    NginxNginx概念简介Nginx是一个轻量级、高性能的反向代理Web服务器,他能实现非常高效的反向代理、负载均衡,他可以处理2-3万并发连接数(tomcat默认150),官方监测能支持5万并发......
  • Nginx 防盗链
    Nginx防盗链本篇主要介绍一下nginx中防盗链的具体配置,以及http的referer头概述防盗链其实就是防止别的站点来引用你的资源,占用你的流量在了解nginx......
  • golang file
    O_RDONLY:只读模式打开文件;O_WRONLY:只写模式打开文件;O_RDWR:读写模式打开文件;O_APPEND:写操作时将数据附加到文件尾部(追加);O_CREATE:如果不存在将创建一个新文件;O_EXCL:和......
  • login.jsp
    ⭕login.jsp页面效果如下:  ......
  • origin标记峰
    【使用Originpro2021实现峰值标注!】https://www.bilibili.com/video/BV1Bp4y1n74X/?share_source=copy_web&vd_source=0333e554058b66b93b147b2b869466dd......
  • nginx https作网关配置webapi路由规则
    为何有这篇文章?因为我有多个小程序,分别调用不同的api站点,服务器只能安装一个https单域名证书。 1、原webapi接口部署完毕,接口地址比如​​http://www.zyiz.net/api/getarti......
  • Nginx 1.14.2 移植指南(openEuler 20.03 LTS SP1)
    介绍简要介绍Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,支持FastCGI、SSL、VirtualHost、URLRewrite、gzi......
  • AtCoder Beginner Contest 281
    A-CountDown(abc281a)题目大意给定\(n\),输出\(n\)到\(1\)。解题思路直接输出即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=l......
  • nginx静态资源配置
    root与aliasroot会拼接locationalias不会拼接location例如rootlocation/static{   root/home/nginx-1.11.2.4/html/pc/dist;}访问http://127.0.0.1:80/static......
  • atcoder beginner contest 144 Gluttony(二分答案)
    题目大意:有an,bn,我们找到an和bn每个元素的一种一一对应关系。使得min(max(ai*bi))。已知我们可以进行操作让an中的任一个元素减少1。操作数最大为k,问我们怎么操作,可以min(......