【Go】gin框架生成压缩包与下载文件
在没有加入下面这串代码之前,下载的压缩包一直为空。遂debug了两个小时。。。
可以在服务端本地创建压缩包。单独将服务端本地的压缩包发送给客户端也是没问题的。但是两个合起来,客户端接收到的压缩包内容就为空了。
期间也尝试了
zipFile.Close()
zipWriter.Close()
但是zipFile不能立刻关
// 关闭 ZIP 归档,确保所有数据都被写入压缩包文件err = zipWriter.Close()if err != nil {fmt.Println("无法关闭 ZIP 归档:", err)return}
将缓冲区中的数据刷新到磁盘上的压缩包文件。
在创建 ZIP 归档后,需要调用 zipWriter.Close() 来确保所有的数据都被写入压缩包文件。在 zipWriter.Close() 被调用之前,压缩包文件可能仍然处于打开状态,并且尚未完全写入磁盘。
func download(c *gin.Context) {tmpData := make(map[string]interface{})if err := c.ShouldBindJSON(&tmpData); err != nil {log.Println(err)c.JSON(http.StatusBadRequest, gin.H{"msg": "请求参数错误"})return}// 获取要下载的文件列表filePaths := tmpData["selectedIds"].([]interface{})// 获取当前时间currentTime := time.Now()// 格式化为特定格式formattedTime := currentTime.Format("2006-01-02-15-04")zipFilename := formattedTime + ".zip"tempZipPath := filepath.Join(zipFilename)// 创建压缩包文件zipFile, err := os.Create(tempZipPath)if err != nil {fmt.Println("无法创建压缩包文件:", err)return}defer zipFile.Close()// 创建 ZIP 归档zipWriter := zip.NewWriter(zipFile)defer zipWriter.Close()for _, filePath := range filePaths {idStr := fmt.Sprintf("%v", filePath)filePath := filepath.Join("nuclei-templates-original", idStr+".yaml")fmt.Printf(filePath)// 添加文件到 ZIP 归档err = addFileToZip(zipWriter, filePath)if err != nil {fmt.Println("无法添加文件到压缩包:", err)return}fmt.Println("文件已成功添加到压缩包中。")}// 关闭 ZIP 归档,确保所有数据都被写入压缩包文件err = zipWriter.Close()if err != nil {fmt.Println("无法关闭 ZIP 归档:", err)return}file, err := os.Open(tempZipPath)if err != nil {c.String(http.StatusInternalServerError, "无法打开压缩包")return}// 获取文件信息fileInfo, err := file.Stat()if err != nil {c.String(http.StatusInternalServerError, "无法获取压缩包信息")return}// 设置响应头c.Header("Content-Type", "application/zip")c.Header("Content-Disposition", "attachment; filename="+tempZipPath)c.Header("Content-Length", strconv.FormatInt(fileInfo.Size(), 10))// 将压缩包内容发送给客户端_, err = io.Copy(c.Writer, file)if err != nil {c.String(http.StatusInternalServerError, "无法发送压缩包")return}}func addFileToZip(zipWriter *zip.Writer, filePath string) error {// 打开要添加的文件file, err := os.Open(filePath)if err != nil {return err}defer file.Close()// 获取文件信息info, err := file.Stat()if err != nil {return err}// 创建 ZIP 归档中的文件header, err := zip.FileInfoHeader(info)if err != nil {return err}// 设置 ZIP 归档中的文件名header.Name = filepath.Base(filePath)// 写入文件到 ZIP 归档writer, err := zipWriter.CreateHeader(header)if err != nil {return err}_, err = io.Copy(writer, file)return err
}
gin框架跟着 狂神说,一个小时速成,讲的很好
这是老师课上的源码
package main
import ("encoding/json""log""net/http""github.com/gin-gonic/gin""github.com/thinkerou/favicon"
)
//自定义go中间件即拦截器
//给所有请求使用 则不不写在下列方法里,写了则拦截指定方法的请求func myHandler() (gin.HandlerFunc) {//通过自定义的中间件,设置的值,在后续处理只要调用了这个中间件的都可以拿到这里的参数return func(context *gin.Context) {context.Set("usersession","userid-1")//if ...context.Next() //放行context.Abort() //阻止}
}
func main() {//创建一个服务ginServer := gin.Default()ginServer.Use(favicon.New("./favicon.ico"))//加载静态页面ginServer.LoadHTMLGlob("templates/*")//加载资源目录ginServer.Static("/static","./static")//Gin RestfulginServer.GET("/hello",myHandler(),func(Context *gin.Context) {//取出中间件中的值usersession := Context.MustGet("userSession").(string) //空接口转换为stringlog.Println("------->",usersession)Context.JSON(200,gin.H{"msg":"hello,world"})})ginServer.POST("/user",func(c *gin.Context) {c.JSON(200,gin.H{"msg":"post,user"})})ginServer.PUT("/user")ginServer.DELETE("/user")//响应一个页面给前端ginServer.GET("/index",func(Context *gin.Context) {Context.HTML(http.StatusOK,"index.html",gin.H{"msg":"这是go后台传递来的数据",}) //接收前端传递过来的参数//info?userid=xxx&username=kuangshen// ginServer.GET("/user/info",func(context *gin.Context) {// userid := context.Query("userid")// username := context.Query("username")// context.JSON(http.StatusOK,gin.H{// "userid": userid,// "username": username,// }) // })//info/1/kaungshenginServer.GET("/user/info/:userid/:username",func(context *gin.Context) {userid := context.Param("userid")username := context.Param("username")context.JSON(200,gin.H{"userid": userid,"username": username,})})//掌握技术后面的应用- 掌握基础知识,加以了解web知识// 前端给后端传递 jsonginServer.POST("/json",func(context *gin.Context) {//request.body//[]body 返回的是切片data,_ := context.GetRawData()var m map[string]interface{}//包装为json数据 []byte_ = json.Unmarshal(data,&m)context.JSON(200,m)})//支持表单ginServer.POST("/user/add",func(context *gin.Context) {username := context.PostForm("username")password := context.PostForm("password")context.JSON(200,gin.H{"msg":"ok","username":username,"password":password,})})//路由ginServer.GET("/test",func(context *gin.Context) {//重定向context.Redirect(301,"http://baidu.com") })//404 NoRouteginServer.NoRoute(func(context *gin.Context) {context.HTML(http.StatusNotFound,"404.html",nil)})//路由组userGroup := ginServer.Group("/user"){userGroup.GET("/add")userGroup.POST("/login")userGroup.POST("/logout")}orderGroup := ginServer.Group("order"){orderGroup.GET("/add")orderGroup.DELETE("/delete")}
})//服务器端口ginServer.Run(":8082")
}
相关文章:
【Go】gin框架生成压缩包与下载文件
在没有加入下面这串代码之前,下载的压缩包一直为空。遂debug了两个小时。。。 可以在服务端本地创建压缩包。单独将服务端本地的压缩包发送给客户端也是没问题的。但是两个合起来,客户端接收到的压缩包内容就为空了。 期间也尝试了 zipFile.Close() zipW…...
iOS 面试题以及自我理解答案
1、简述push原理,push的证书和其他的有什么不一样? 第 一阶段:BeejiveIM服务器把要发送的消息、目的iPhone的标识打包,发给APNS。 第二阶段:APNS在自身的已注册Push服务 的iPhone列表中,查找有相应标识的iP…...
vue实现自定义滚动条
vue实现自定义滚动条 具体效果如下,这边我用的rem单位,比例是1:40, 先写下页面布局,把原生的滚动条给隐藏掉,给自定义的滑块增加transition: marginLeft 1s linear;可以使左边距过度的更顺滑 .top-box-2::-webkit-scr…...
基于Qt C++的工具箱项目源码,含命令行工具、桌面宠物、文献翻译、文件处理工具、医学图像浏览器、插件市场、设置扩展等工具
一、介绍 1. 基本信息 完整代码下载地址:基于Qt C的工具箱项目源码 TBox是一款基于Qt C的工具箱。用户可以自行选择安装所需的工具(以插件的形式),将TBox打造成专属于自己的效率软件。TBox基本界面展示如下: 2. 使用…...
C# AnimeGANv2 人像动漫化
效果 项目 下载 可执行程序exe下载 源码下载 其他 C# 人像卡通化 Onnx photo2cartoon-CSDN博客...
gateway接口参数加解密
上篇介绍了多种加解密的使用java加密使用 本篇主要介绍在gateway网关中使用对参数解密和返回数据进行加密的操作 原理 下面使用的是AES加密 SHA1withRSA加签 1-用户使用拿到的AES秘钥和RSA私钥。对数据进行加密和加签 2-进行验签和时间的检验 3-将解密的数据返回到具体的调用…...
WorkPlus定制化的局域网会议软件,提供安全稳定的会议体验
在现代商业环境中,迅速而高效的沟通是企业成功的关键要素之一。而在传统的会议模式下,时间成本和地理限制往往给企业带来不小的困扰。针对这一问题,WorkPlus推出了一款创新的局域网会议软件——WorkPlus Meet,旨在为企业创造高效的…...
干货|小白也能自制电子相册赶紧码住~
你是否想拥有一个独一无二的电子相册,却又苦于不知道如何下手?今天教你一个简单的方法,即使你是小白,也能轻松自制电子相册! 一、选择合适的工具 首先,你需要选择一个合适的工具来制作电子相册。有很多工具…...
docker之Harbor私有仓库
目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 1、六个组件 2、七个容器 四、私有镜像仓库的上传与下载 五、部署docker-compose服务 把项目中的镜像数据进行打包持久数据,如镜像,数据库等在宿主机的/data/目录下, 一、什么…...
服务器上部署python脚本
1.查看服务器上的python是否自带,一般都自带 2.将本地脚本上传到服务器 3.直接运行一下脚本看报什么错误 代码错误, 将f删除后报别的错误 上面是未安装依赖的错误。我们安装一下依赖 下面是编码的解决 #!/usr/bin/python # -*- coding: utf-8 -*- 先把…...
【excel技巧】如何在Excel表格中添加选项按钮?
不知道大家是否会9遇到需要勾中选项的情况,我们可以在电子表格中制作出可以勾选、选中的选项按钮,今天我们一起学习一下设置方法。 首先,我们需要先在excel工具栏中添加一个功能模块:开发工具 依次点击excel中的文件 – 选项 –…...
前端 vite+vue3——写一个随机抽奖组件
文章目录 ⭐前言⭐设计布局⭐交互设计⭐整体代码⭐insicode代码 ⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于前端 vitevue3——写一个抽奖随机组件。 vue3系列相关文章: 前端vue2、vue3去掉url路由“ # ”号——nginx配置 csdn新星计…...
语音芯片基础知识 什么是语音芯 他有什么作用 发展趋势是什么
目录 一、语音芯片的简介 常见的语音芯片有哪些? 语音芯片的种类有很多,大体区分下来也就4个类别而已: 选型的经验说明如下: 推荐使用flash型语音芯片 一、语音芯片的简介 语音芯片基础知识: 什么是语音芯片&…...
设计模式01———简单工厂模式 c#
首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 任务:使用【简单工厂模式】生成四种不同怪物 【按不同路径移动】 首先资源商店下载四个怪物模型 接下来我们选取四个怪物作为预制体并分别起名…...
如何解决MidJourney错过付费后被暂停
问题 假定你已经成功订阅购买了 MidJourney 一段时间,下个月扣费周期到了。 如果你卡里余额不足,卡被封或失效了,或者你想着最近没啥用得上 MidJourney 的地方先省着不续费,等要用的时候就用不了。 如果想要去官网的续费页&…...
考研人考研魂——英语单词篇(20231010)
下一站,上岸 transplanttransportstorestoragestockstridestrikestringstructurestrikingstunprimaryprimeprimitiveprincipalpsychiatryprinciplepsychologyliableliberal transplant n. (器官等的)移植;移植的器官 vt. 移植&a…...
java 版 项目管理工程系统,实现项目全周期管理-源码交付
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…...
TOGAF(企业架构)
TOGAF 核心概念(官方原版) 什么是TOGAF? TOGAF?是一种经验证的企业架构方法和框架,被世界领先的组织用于提高业务效率。它是一个企业架构标准,确保企业架构专业人员之间的标准、方法和通信一致,以便我们…...
vue中v-model的原理是什么?v-model作用在组件上的原理是什么?sync修饰符的原理是什么?
vue中v-model的原理是什么? 特点:双向绑定 数据>视图 视图>数据 场景: 收集表单数据组件上 原理: v-model只是个语法题,本质是:v-model v-bind (:value) v-on (input) <template><…...
新闻api接口,新闻资讯,社交媒体,体育赛事,全国热门带正文新闻查询API接口
一、接口介绍 解决同一类新闻在不同平台上的内容获取问题,在归档主流新闻平台的内容数据基础上,对外提供统一的调用方式来完成实时、最新的相关新闻的获取,极大方便各类企业在自有软件中集成新闻内容的功能。支持200余个新闻大站,…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
