go 解压和压缩包

將压缩包放在zippath="D:/xx/xx/xx"中,解压到pathto="D:/xx/xx1/xx"中

type UploaddeployLogic struct {logx.Loggerctx    context.ContextsvcCtx *svc.ServiceContextr      *http.Request
}func NewUploaddeployLogic(r *http.Request, svcCtx *svc.ServiceContext) *UploaddeployLogic {return &UploaddeployLogic{Logger: logx.WithContext(r.Context()),ctx:    r.Context(),svcCtx: svcCtx,r:      r,}
}
func (l *UploaddeployLogic) Uploaddeploy() (resp *types.UploadResp, err error) {fmt.Println("Uploaddeploy")// 解析上传的multipart表单数据// 从表单中获取名为"file"的文件。file, handler, err := l.r.FormFile("file")if err != nil {logx.Error("the value of file cannot be found")return nil, errorx.NewCodeError(errorcode.InvalidArgument,l.svcCtx.Trans.Trans(l.ctx, "file.parseFormFailed"))}// 延迟关闭文件,在函数返回时自动执行。这确保了无论后续代码路径如何,文件都会被正确关闭。defer file.Close()// 校验后缀是否合法,校验有没有后缀dotIndex := strings.LastIndex(handler.Filename, ".")// 拒绝无后缀文件if dotIndex == -1 {logx.Errorw("reject the file which does not have suffix")return nil, errorx.NewCodeError(errorcode.InvalidArgument,l.svcCtx.Trans.Trans(l.ctx, "file.wrongTypeError"))}_, fileSuffix := handler.Filename[:dotIndex], handler.Filename[dotIndex+1:]fileUUID := uuidx.NewUUID()storeFileName := fileUUID.String() + "." + fileSuffix// 判断文件大小是否超过设定值fileType := strings.Split(handler.Header.Get("Content-Type"), "/")[0]if fileType != "image" && fileType != "video" && fileType != "audio" {fileType = "other"}zipPath := l.r.Form["zippath"][0]pathto := l.r.Form["pathto"][0]// 这段代码用于检查公共存储目录是否存在,如果不存在则创建该目录。if !fileutil.IsExist(zipPath) {err = fileutil.CreateDir(zipPath + "/")if err != nil {logx.Errorw("failed to create directory for storing zip files", logx.Field("path", zipPath))return nil, errorx.NewCodeError(errorcode.Internal,l.svcCtx.Trans.Trans(l.ctx, i18n.Failed))}}// 将上传的文件保存到zipPath中zipFilePath := path.Join(zipPath, handler.Filename)targetFile, err := os.Create(zipFilePath)_, err = io.Copy(targetFile, file)if err != nil {logx.Errorw("fail to create file", logx.Field("path", path.Join(zipPath, storeFileName)))return nil, errorx.NewCodeError(errorcode.Internal,l.svcCtx.Trans.Trans(l.ctx, i18n.Failed))}targetFile.Close()// 创建目标路径if err := os.MkdirAll(pathto, os.ModePerm); err != nil {logx.Errorw("failed to create target directory", logx.Field("path", pathto), logx.Field("error", err))return nil, errorx.NewCodeError(errorcode.Internal, l.svcCtx.Trans.Trans(l.ctx, i18n.Failed))}// 解压缩文件到pathto中err = unzipFile(zipFilePath, pathto)if err != nil {logx.Errorw("fail to create file", logx.Field("path", path.Join(pathto, storeFileName)))return nil, errorx.NewCodeError(errorcode.Internal,l.svcCtx.Trans.Trans(l.ctx, i18n.Failed))}return &types.UploadResp{BaseDataInfo: types.BaseDataInfo{Msg: l.svcCtx.Trans.Trans(l.ctx, i18n.Success)},Data:         types.UploadInfo{Name: handler.Filename, Url: l.svcCtx.Config.UploadConf.ServerURL},}, nil
}func unzipFile(zipFilePath, destDir string) error {r, err := zip.OpenReader(zipFilePath)if err != nil {return err}defer r.Close()for _, f := range r.File {rc, err := f.Open()if err != nil {return err}defer rc.Close()targetFilePath := filepath.Join(destDir, f.Name)if f.FileInfo().IsDir() {os.MkdirAll(targetFilePath, os.ModePerm)} else {targetFile, err := os.Create(targetFilePath)if err != nil {return err}defer targetFile.Close()_, err = io.Copy(targetFile, rc)if err != nil {return err}}}return nil
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring-Cloud-Gateway集成Sentinel限流

1&#xff09;gateway添加sentinel相关依赖 <spring-cloud.version>2021.0.1</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version><dependencies><!--gateway--><dependency><gro…

Linux yum与rpm区别

yum和rpm都是Linux系统中用于安装、升级和管理软件包的工具&#xff0c;但它们有一些区别。以下是yum和rpm的主要区别&#xff1a; 1. 功能&#xff1a;rpm是一种软件包管理工具&#xff0c;用于安装、升级和卸载软件包。它可以直接操作软件包文件&#xff0c;但不提供依赖关系…

JQUERY简介与分析

在现代的前端开发中&#xff0c;jQuery无疑是一个非常重要且广泛使用的工具库。它不仅简化了JavaScript的编写&#xff0c;还提供了丰富的功能和强大的选择器&#xff0c;使开发者能够更轻松地操作DOM元素、处理事件和实现动态效果。 简单来说&#xff0c;jQuery是一个快速、简…

【主流开发语言和开发环境介绍】

主流开发语言和开发环境介绍 1. 介绍2. 开发语言3. 开发环境 1. 介绍 下面是一些广泛使用的主流开发语言及其相关的开发环境。 2. 开发语言 Python 用途&#xff1a;通用编程、科学计算、数据分析、机器学习、Web开发等。流行库&#xff1a;NumPy, Pandas, TensorFlow, PyTor…

JavaWeb开发初体验

1.动态网站 动态网站可根据不同情况动态变更的网站&#xff0c;动态网站的网页文件包含程序代码&#xff0c;通过后台数据库与web服务器信息交互&#xff0c;由后台数据库提供实时数据更新和数据查询服务。 2.动态网站的功能特点 动态网站可以实现交互功能&#xff0c;…

面试redis篇-11Redis集群方案-哨兵

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下: 监控:Sentinel 会不断检查您的master和slave是否按预期工作自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主通知:Sentinel充当…

Springboot企业级开发--开发入门01

目录 目录 一.Spring Boot的主要特点和优势包括&#xff1a; 二.Spring Boot的核心功能可以归纳为以下几点&#xff1a; 三.Springboot是如何解决问题&#xff1f; Spring Boot 是一个开源的Java框架&#xff0c;其设计目标是为了简化新Spring应用的初始搭建以及开发过程。…

POST参数里加号+变成空格的问题处理

今天遇到个这样的问题&#xff0c;从前端传到后端的加密报文&#xff0c;里面包含了号&#xff0c;但在后端日志输出看出&#xff0c;变成空格。这个是由于经过RSA加密后引起的 解决办法&#xff1a; 1.前端转码&#xff1a;使用encodeURIComponent对参数进行转码 2.后端解码…

电脑上查看已保存WiFi密码方法

在电脑上查看WiFi密码有几种方法&#xff0c;以下是其中两种常见的方法&#xff1a; 方法一&#xff1a;通过已连接的WiFi网络查看密码 打开电脑的WiFi设置界面&#xff08;通常可以在任务栏的通知区域找到WiFi图标&#xff0c;点击即可进入设置&#xff09;。 找到已连接的W…

理解Stable Diffusion、LoRA、Dreambooth、Hypernetworks、Textual Inversion、Checkpoint

前言 在深度学习和人工智能的领域中&#xff0c;模型生成和调整技术的快速发展为创造性内容的自动化提供了新的可能性。本文将介绍四种重要的模型技术——Stable Diffusion、LoRA、Dreambooth、和Hypernetworks——它们在生成艺术、个性化模型调整和网络结构设计方面各自的特点…

【初始RabbitMQ】高级发布确认的实现

在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递呢&#xff1f; …

python Matplotlib Tkinter-->tab切换2

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.ttk as ttk# 创建自定义工具栏类 c…

面试redis篇-12Redis集群方案-分片集群

原理 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决&#xff1a; 海量数据存储问题高并发写的问题 使用分片集群可以解决上述问题&#xff0c;分片集群特征&#xff1a; 集群中有多个master&#xff0c;每个master保存不同数据每个master都可以有…

10 Redis之SB整合Redis

7. SB整合Redis Spring Boot 中可以直接使用 Jedis 实现对 Redis 的操作&#xff0c;但一般不这样用&#xff0c;而是使用 Redis操作模板 RedisTemplate 类的实例来操作 Redis。 RedisTemplate 类是一个对 Redis 进行操作的模板类。该模板类中具有很多方法&#xff0c;这些方…

compose 创建button示例

在 Jetpack Compose 中&#xff0c;创建一个按钮&#xff08;Button&#xff09;的实例是相对简单的。下面是一个基本的 Button 示例&#xff0c;展示了如何定义一个带有点击事件和文本的按钮&#xff1a; kotlin 复制 import androidx.compose.foundation.layout.fillMaxWidt…

Node.js-文件读取输入

Node.js-文件读取输入 fs模块&#xff08;操作文件的模块&#xff09; 读取 fs.readFile(path[, options], callback)&#xff1b;[]里面 是可选参数&#xff0c;表示以什么样的编码 格式读取path是路径callback表示读取完成后的回调函数 例子 fs.readFile (‘./files/11.txt…

【手机端测试】adb基础命令

一、什么是adb adb&#xff08;Android Debug Bridge&#xff09;是android sdk的一个工具 adb是用来连接安卓手机和PC端的桥梁&#xff0c;要有adb作为二者之间的维系&#xff0c;才能让用户在电脑上对手机进行全面的操作。 Android的初衷是用adb这样的一个工具来协助开发人…

el-submenu is-opened 展开/闭合;el-submenu is-opened保持一个子菜单的展开控制

写了个mes系统目录 点击子菜单展开后&#xff0c;上一级菜单没有默认关闭。主流后台管理系统大部分都是保持一个子菜单关闭状态、 问度娘无果后&#xff0c;查询官网&#xff0c;一个属性搞定。 unique-opened 是否只保持一个子菜单的展开 加在 <el-menu 组件上即可 完整代…

解决Docker镜像中CentOS 8仓库问题

前言&#xff1a; 在yum执行过程中&#xff0c;持续遇到与CentOS 8上的’appstream’仓库元数据检索相关的错误。具体错误消息为&#xff1a;“错误&#xff1a;下载’appstream’仓库元数据失败&#xff1a;无法准备内部镜像列表&#xff1a;镜像列表中没有URL。” 问题分析&…

LeetCode_Java_动态规划系列(1)(题目+思路+代码)

目录 斐波那契类型 746.使用最小花费爬楼梯 矩阵 120. 三角形最小路径和 斐波那契类型 746.使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。…