当前位置: 首页 > news >正文

【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的原理是什么&#xff1f; 特点&#xff1a;双向绑定 数据>视图 视图>数据 场景&#xff1a; 收集表单数据组件上 原理&#xff1a; v-model只是个语法题&#xff0c;本质是&#xff1a;v-model v-bind (:value) v-on (input) <template><…...

新闻api接口,新闻资讯,社交媒体,体育赛事,全国热门带正文新闻查询API接口

一、接口介绍 解决同一类新闻在不同平台上的内容获取问题&#xff0c;在归档主流新闻平台的内容数据基础上&#xff0c;对外提供统一的调用方式来完成实时、最新的相关新闻的获取&#xff0c;极大方便各类企业在自有软件中集成新闻内容的功能。支持200余个新闻大站&#xff0c;…...

3步轻松掌握:163MusicLyrics歌词下载完全指南

3步轻松掌握&#xff1a;163MusicLyrics歌词下载完全指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为找不到高质量的LRC歌词而烦恼吗&#xff1f;163MusicLyri…...

5分钟免费制作专业AI翻唱:AICoverGen完整指南

5分钟免费制作专业AI翻唱&#xff1a;AICoverGen完整指南 【免费下载链接】AICoverGen A WebUI to create song covers with any RVC v2 trained AI voice from YouTube videos or audio files. 项目地址: https://gitcode.com/gh_mirrors/ai/AICoverGen 想让AI帮你翻唱…...

3分钟掌握跨平台模组下载神器:WorkshopDL全攻略

3分钟掌握跨平台模组下载神器&#xff1a;WorkshopDL全攻略 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为Epic Games或GOG平台的游戏无法使用Steam创意工坊模组而烦恼吗…...

Token工厂:从“卖流量”到“卖Token”:中国移动砸百亿建Token生态,三大运营商的AI战争升级,阿里,百度,华为,字节跟进

5月9日&#xff0c;2026移动云大会上&#xff0c;中国移动市场经营部总经理邱宝华扔出一个新概念——"Token运营体系"。未来3-5年&#xff0c;中国移动将投入百亿级Token生态资源&#xff0c;建设千亿级算力基础设施&#xff0c;携手共创万亿级AI产业价值。"百亿…...

从0到1:手把手教你搭建VSCode(附避坑指南,拒绝报错),全程复制粘贴即可

&#x1f525;个人主页&#xff1a;北极的代码&#xff08;欢迎来访&#xff09; &#x1f3ac;作者简介&#xff1a;java后端学习者 ❄️个人专栏&#xff1a;苍穹外卖日记&#xff0c;SSM框架深入&#xff0c;JavaWeb ✨命运的结局尽可永在&#xff0c;不屈的挑战却不可须臾或…...

基于RP2040与CircuitPython的HDMI倒计时器:RTC与DVI原生输出实践

1. 项目概述与核心价值如果你手头有一块带HDMI输出的微控制器开发板&#xff0c;比如Adafruit的Feather RP2040 DVI&#xff0c;又恰好需要一个能摆在桌面上、精确到秒的倒计时器&#xff0c;那么今天这个项目就是为你量身定做的。它不仅仅是一个简单的“Hello World”式显示应…...

PCL2启动器离线登录按钮消失?5分钟快速修复指南

PCL2启动器离线登录按钮消失&#xff1f;5分钟快速修复指南 【免费下载链接】PCL Minecraft 启动器 Plain Craft Launcher&#xff08;PCL&#xff09;。 项目地址: https://gitcode.com/gh_mirrors/pc/PCL 你是否遇到过PCL2启动器离线登录按钮突然消失的困扰&#xff1…...

设计师速存!Midjourney未公开的风格隐藏开关:--style raw、--s 750、--no texture三者协同作用的神经渲染原理(GPU显存占用下降41%实测)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;设计师速存&#xff01;Midjourney未公开的风格隐藏开关&#xff1a;--style raw、--s 750、--no texture三者协同作用的神经渲染原理&#xff08;GPU显存占用下降41%实测&#xff09; Midjourney v6.1…...

Cursor编辑器性能优化:精准重置缓存与进程的开发者效率工具

1. 项目概述&#xff1a;一个被低估的开发者效率工具如果你是一名开发者&#xff0c;尤其是深度使用 Cursor 这类 AI 驱动的代码编辑器&#xff0c;那么你一定遇到过这样的场景&#xff1a;编辑器突然变得卡顿、代码补全失灵、AI 建议变得驴唇不对马嘴&#xff0c;或者插件行为…...

详解C++作用域与生命周期

Pascal之父Nicklaus Wirth曾经提出一个公式&#xff0c;展示出了程序的本质&#xff1a;程序算法数据结构。后人又给出一个公式与之遥相呼应&#xff1a;软件程序文档。这两个公式可以简洁明了的为我们展示程序和软件的组成。程序的运行过程可以理解为算法对数据的加工过程&…...