JAVA SpringBoot zip文件夹重命名

使用java对文件夹中文件后缀进行修改 在网上找到的项目资料,本打算学习下,结果给的资料是ziw格式,需要使用为知笔记才能打开,百度半天没有找到为知笔记的下载方式,但是看到可以转换格式为zip,然后进行解压,以html格式可以打开。 看了下文件夹下文件夹太多,放弃了一个一个转换格式的想法。。。。。 话不多说上代码:... 阅读详情

因为项目采用obs文件存储,导致同名文件会被覆盖,所以采用后台根据时间戳重命名的方式,别的文件类型都没有问题,到zip的时候,发现解压后的文件名还是重命名之前的文件名,所以要实现zip文件里面的文件夹也改为新的命名。

一开始的设想是有没有方法能够在不解压的情况下实现,无奈没有找到,有知道的小伙伴可以指点一下。于是只能使用常规的思路,先解压,重命名,再加压的方式。

项目使用zip4j完成解压、加压操作,需要在pom.xml中添加

<dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>1.3.2</version>
</dependency>

一、文件保存到临时地址

因为项目使用的MultipartFile接受文件,所以要先转为File,并存放到临时地址

String zipName = multipartFile.getOriginalFilename();
String path = getPath();
System.out.println(path);
File file = new File(path + zipName);
System.out.println(file);
if (!file.getParentFile().exists()) {
   file.getParentFile().mkdirs();
}
multipartFile.transferTo(file);

/**
* 获取不同环境文件存放地址
**/
public static String getPath() {
   String env = ProfileUtil.getActiveProfile();
   String path = null;
   if (env.equals("dev")) {
       path = "Windows环境地址";
   } else {
       path = "服务器文件存放地址";
   }
   return path;
}

二、解压

String newFoldel = "自定义新文件名";
ZipFile zFile = new ZipFile(file);
zFile.setFileNameCharset("gbk");
String dest = path + newFoldel;
File destDir = new File(dest);
zFile.extractAll(dest);

三、重命名

file自带的renameTo可以进行重命名文件夹

String orgFoldel = multipartFile.getOriginalFilename().substring(0, multipartFile.getOriginalFilename().lastIndexOf("."));
File file1 = new File((path + newFoldel + "/" + orgFoldel));
file1.renameTo(new File(path + newFoldel + "/" + newFoldel));

四、压缩并转为MultipartFile

ZipFile newZipFile = fastZip(path, newFoldel + ".zip", path + newFoldel);

File newFile = new File(path, newFoldel + ".zip");
FileInputStream fileInputStream = new FileInputStream(newFile);
MultipartFile newMultipartFile = new MockMultipartFile(newFile.getName(), newFile.getName(),
        ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);

/**
 * zip4j压缩目录为一个zip包
 * <p>
 * 同一路径多次压缩只会生成一个zip包
 * 返回null表示压缩失败,
 * 返回ZipFile对象表示压缩成功。
 *
 * @param productZipDir    生成的zip包存放路径 (d:\\xxx\\xx\\)
 * @param productZipName   生成的zip包名 (xxx.zip)
 * @param originalDestPath 要压缩的原始目录地址(e:\\xxx\\xx\\)
 * @throws ZipException
 */
public static ZipFile fastZip(String productZipDir, String productZipName, String originalDestPath) throws ZipException {

    if (StringUtils.isEmpty(productZipDir)) {
        return null;
    }
    if (StringUtils.isEmpty(productZipName)) {
        return null;
    }
    if (StringUtils.isEmpty(originalDestPath)) {
        return null;
    }

    //zip包存放路径 不存在则建立
    File productDir = new File(productZipDir);
    if (!productDir.exists()) {
        productDir.mkdirs();
    }

    //要压缩的原始目录地址 不存在则返回null
    File originalPath = new File(originalDestPath);
    if (!originalPath.isDirectory()) {
        return null;
    }
    if (!originalPath.exists()) {
        return null;
    }


    // 生成的压缩文件
    ZipFile zipFile = new ZipFile(productZipDir + productZipName);


    ZipParameters parameters = new ZipParameters();
    // 压缩方式 8
    parameters.setCompressionMethod(8);
    // 压缩级别 5
    parameters.setCompressionLevel(5);
    // 要打包的文件夹
    File currentFile = new File(originalDestPath);
    File[] fs = currentFile.listFiles();
    // 遍历originalDestPath文件夹下所有的文件、文件夹
    for (File f : fs) {
        if (f.isDirectory()) {
            zipFile.addFolder(new File(f.getPath()), parameters);
        } else {
            zipFile.addFile(f, parameters);
        }
    }
    //返回zip包对象
    return zipFile;
}

五、删除临时文件

public static boolean deleteFile(String fileName) {
    File file = new File(fileName);
    // 如果文件路径只有单个文件
    if (file.exists() && file.isFile()) {
        if (file.delete()) {
            System.out.println("删除文件" + fileName + "成功!");
            return true;
        } else {
            System.out.println("删除文件" + fileName + "失败!");
            return false;
        }
    } else {
        System.out.println(fileName + "不存在!");
        return false;
    }
}


public static boolean deleteAllFile(String dir) {
    // 如果dir不以文件分隔符结尾,自动添加文件分隔符
    File dirFile = new File(dir);
    // 如果dir对应的文件不存在,或者不是一个目录,则退出
    if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
        System.out.println("删除文件夹失败:" + dir + "不存在!");
        return false;
    }
    boolean flag = true;
    // 删除文件夹中的所有文件包括子文件夹
    File[] files = dirFile.listFiles();
    for (int i = 0; i < files.length; i++) {
        // 删除子文件
        if (files[i].isFile()) {
            flag = deleteFile(files[i].getAbsolutePath());
            if (!flag)
                break;
        }
        // 删除子文件夹
        else if (files[i].isDirectory()) {
            flag = deleteAllFile(files[i].getAbsolutePath());
            if (!flag)
                break;
        }
    }
    if (!flag) {
        System.out.println("删除文件夹失败!");
        return false;
    }
    // 删除当前文件夹
    if (dirFile.delete()) {
        System.out.println("删除文件夹" + dir + "成功!");
        return true;
    } else {
        return false;
    }
}

六、完整代码

ZipUtils.java

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import org.apache.http.entity.ContentType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ZipUtils {
    public static MultipartFile decZip(String apiName, MultipartFile multipartFile) throws IOException, ZipException {
        String zipName = multipartFile.getOriginalFilename();
        String path = getPath();

        System.out.println(path);
        File file = new File(path + zipName);
        System.out.println(file);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        multipartFile.transferTo(file);

        //解压
        String newFoldel = "自定义文件夹名称";
        ZipFile zFile = new ZipFile(file);
        zFile.setFileNameCharset("gbk");
        String dest = path + newFoldel;
        File destDir = new File(dest);
        zFile.extractAll(dest);
        
        //重命名
        String orgFoldel = multipartFile.getOriginalFilename().substring(0, multipartFile.getOriginalFilename().lastIndexOf("."));
        File file1 = new File((path + newFoldel + "/" + orgFoldel));
        file1.renameTo(new File(path + newFoldel + "/" + newFoldel));

        //压缩
        ZipFile newZipFile = fastZip(path, newFoldel + ".zip", path + newFoldel);
        File newFile = new File(path, newFoldel + ".zip");
        FileInputStream fileInputStream = new FileInputStream(newFile);
        MultipartFile newMultipartFile = new MockMultipartFile(newFile.getName(), newFile.getName(),
                ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
        return newMultipartFile;
    }

    /**
     * zip4j压缩目录为一个zip包
     * <p>
     * 同一路径多次压缩只会生成一个zip包
     * 返回null表示压缩失败,
     * 返回ZipFile对象表示压缩成功。
     *
     * @param productZipDir    生成的zip包存放路径 (d:\\xxx\\xx\\)
     * @param productZipName   生成的zip包名 (xxx.zip)
     * @param originalDestPath 要压缩的原始目录地址(e:\\xxx\\xx\\)
     * @throws ZipException
     */
    public static ZipFile fastZip(String productZipDir, String productZipName, String originalDestPath) throws ZipException {

        if (StringUtils.isEmpty(productZipDir)) {
            return null;
        }
        if (StringUtils.isEmpty(productZipName)) {
            return null;
        }
        if (StringUtils.isEmpty(originalDestPath)) {
            return null;
        }

        //zip包存放路径 不存在则建立
        File productDir = new File(productZipDir);
        if (!productDir.exists()) {
            productDir.mkdirs();
        }

        //要压缩的原始目录地址 不存在则返回null
        File originalPath = new File(originalDestPath);
        if (!originalPath.isDirectory()) {
            return null;
        }
        if (!originalPath.exists()) {
            return null;
        }


        // 生成的压缩文件
        ZipFile zipFile = new ZipFile(productZipDir + productZipName);


        ZipParameters parameters = new ZipParameters();
        // 压缩方式 8
        parameters.setCompressionMethod(8);
        // 压缩级别 5
        parameters.setCompressionLevel(5);
        // 要打包的文件夹
        File currentFile = new File(originalDestPath);
        File[] fs = currentFile.listFiles();
        // 遍历originalDestPath文件夹下所有的文件、文件夹
        for (File f : fs) {
            if (f.isDirectory()) {
                zipFile.addFolder(new File(f.getPath()), parameters);
            } else {
                zipFile.addFile(f, parameters);
            }
        }
        //返回zip包对象
        return zipFile;
    }

    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径只有单个文件
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                System.out.println("删除文件" + fileName + "成功!");
                return true;
            } else {
                System.out.println("删除文件" + fileName + "失败!");
                return false;
            }
        } else {
            System.out.println(fileName + "不存在!");
            return false;
        }
    }


    public static boolean deleteAllFile(String dir) {
        File dirFile = new File(dir);
        // 如果dir对应的文件不存在,或者不是一个目录,则退出
        if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
            System.out.println("删除文件夹失败:" + dir + "不存在!");
            return false;
        }
        boolean flag = true;
        // 删除文件夹中的所有文件包括子文件夹
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
            // 删除子文件夹
            else if (files[i].isDirectory()) {
                flag = deleteAllFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag) {
            System.out.println("删除文件夹失败!");
            return false;
        }
        // 删除当前文件夹
        if (dirFile.delete()) {
            System.out.println("删除文件夹" + dir + "成功!");
            return true;
        } else {
            return false;
        }
    }

    public static String getPath() {
        String env = ProfileUtil.getActiveProfile();
        String path = null;
        if (env.equals("dev")) {
            path = "开发环境地址";
        } else {
            path = "运营环境地址";
        }
        return path;
    }
}

    

java导出文件为zip 阅读详情

相关推荐

Cursor配置Java+SpringBoot开发环境全指南(Windows版)

Java 是一门强类型、依赖完整构建生态的编程语言,其开发体验高度依赖 JDK 运行时、Maven 构建链路与框架语义理解能力。在基于 VS Code 内核的智能编辑器 Cursor 中,Java 支持并非开箱即用,而是需通过 JDK 路径绑定、LSP 语言服务器配置、Spring Boot 扩展协同等多层技术栈显式组装。这一过程尤其在 Windows 系统下易受环境变量、注册表读取、路径编码及工作区层级影响。掌握 cursor 配置本质,就是掌握如何为 AI 编程助手注入 Java 项目上下文——使其能识

weixin_33727510的博客 455

JAVA基础必备功能之导出ZIP文件

把csv文件转为byte数组,然后再通过fileTozip方法输出zip文件即可。导出思路需要导出的文件转存为byte数组保存到Map,然后遍历压缩成zip。比较常用的两种导出图片压缩文件,导出excel压缩文件;

风吹淡了悲伤 2822

Java导出压缩包zip文件

需要导出一些图片和一个文本,一起放到zip压缩包中。

weixin_49456013的博客 842

深度学习暑期科研项目(两个月发EI论文)

对本科生而言,越早接触系统的科研训练开始上手科研项目,就越能在未来的升学求职中占据很大的优势。暑假是提升个人简历、丰富科研经历的最佳时期!哈尔滨工业大学博士师兄也会在8月1日开始带大家上手科研项目,并撰写发表EI会议论文。

Magnolia_He的博客 1444

QT实现Word读写

在windows环境下,我们可以通过ActiveQt实现Office自动化,相当于VB的VBA功能。 以下是一个实例: #include #include #include int main(int argc, char *argv[]) {     QApplication a(argc, argv);     //显示的打开一个word应用程序     QAxW

nameofhsw的专栏 1万+

JAVA生成Zip文件并导出

JAVA生成Zip文件并导出

qq_38254635的博客 5892

医学图像分割实战:基于TransUNet训练自己的眼底硬渗出物数据集(附完整代码)

本文详细介绍了基于TransUNet的眼底硬渗出物分割实战指南,涵盖数据预处理、模型调优、训练策略及性能优化等关键环节。通过代码复现和实验对比,展示了TransUNet在医学图像分割中的优势,为糖尿病视网膜病变的早期诊断提供技术支持。

weixin_42524708的博客 363

java分片上传zip_利用SpringBoot和vue-simple-uploader进行文件的分片上传

引入工具 commons-iocommons-io2.6commons-langcommons-lang2.6控制类 import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;import org.springframework.web.bind.annotation.RequestMapping;import ...

weixin_42291186的博客 619

使用 Simulink/Simscape Electrical/Stateflow,构建一个并网逆变器短路故障动态响应与恢复策略仿真模型

本文基于Simulink平台,详细介绍了并网逆变器短路故障的动态响应与恢复策略仿真方法。主要内容包括:1)构建包含热模型的高精度逆变器模型;2)模拟IGBT击穿和桥臂直通两种短路故障;3)设计基于Stateflow的微秒级快速保护逻辑;4)实现放电、去磁、自检、重启的完整恢复流程。仿真结果表明,所提出的保护方案能在200μs内有效限制故障电流,避免器件永久损坏,并通过标准化恢复流程实现系统安全重启。文章还探讨了硬件保护协同、多级保护和预测保护等高级策略,为电力电子系统安全防护提供了实用解决方案。

xiaoheshang_123的博客 107

14、方法论 - 自顶向下与自底向上的结合

本文探讨了如何将自顶向下的规范驱动方法与自底向上的组件构建方法相结合,以形成更加全面的编程理论。通过引入代数法则,简化逻辑关系、提高代码可读性并支持形式化验证,结合实际案例(如智能家居控制系统)展示了如何在设计和实现阶段确保系统的正确性和可靠性。文章还讨论了工具支持的重要性,并提出了未来发展的方向。

lstm7chronicler的博客 176

springboot中使用freemarker生成word文档并打包成zip下载(简历)

一、设计出的简历模板图以及给的简历小图标切图 二、按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件; 三、直接将该xml文件重命名为.ftl文件,并用编辑器(EditPlus)打开并修改 说明:字段取值用Map来存取;    ${pictureAddrees!"...."} picture...

weixin_30399155的博客 1219

如何免费快速的部署一个自用免VIP的自动追剧工具!NAS新玩法!豆瓣与迅雷结合,轻松实现自动下载电影自动追剧功能(支持Windows,群晖nas,飞牛nas,软路由,服务器等Docker快速部署)

追剧党狂喜!豆瓣追剧神器,自动添加云盘,自动下载,微信通知,一键搞定!

XiaoqiangClub的博客 4584

SpringBoot整合logback日志框架,输出指定日志文件夹

简介 log4j和logback都是对日志接口slf4j的实现版本,但logback性能更优,日志处理更迅速,定位更准; SpringBoot已默认整合logback日志框架,适用于大多数场景; 实践 maven添加依赖(由于springboot已经集成logback日志框架,所以可以直接使用): <!--logback日志框架已经嵌套在springboot框架依赖里面,包含logb...

alan_liuyue的博客 5730

基于MATLAB开发AUTOSAR软件应用层模块-part3.自动生成的代码文件介绍

上篇文章我们介绍了如何设计一个简单的模型,之后自动生成autosar架构的代码,这篇文章我带大家看下,生成了哪些文件,以及这些文件的内容。 生成的文件见下图: model files是模型控制逻辑部分代码,包括 DEMO1.c DEMO1.h DEMO1_private.h DEMO1_types.h DEMO1.c 1 /* 2 * File: DEMO1.c 3 * 4 * Cod.

汽车软件开发 1978

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Vue+springboot实现excel导出和zip导出,需二进制返回及跨域问题

vue 中main.js文件,如果有mock,一定要去掉,要不然会自动删除responseType类型。js 部分代码,我用的是ts封装axios 提供了多种方式。压缩文件工具类 FileToZip.java。response返回结果判断并返回。index.vue重要部分代码。在pom文件中添加对应的依赖。Excel导入导出工具类。//调用zip流的接口。//调用xls流的接口。实体类ScoreVo。

ourenyou的博客 874

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java 跨服务器文件夹创建_java开发者linux入门

前言在入门linux的时候感觉大部分很糟糕的,尤其是java开发者来说,对于非运维人员可能刚开始会对linux有很大的抵触性,可能还是更多喜欢桌面操作。或者在之前的学习中本来web的一堆东西就已经够绕的了,怎么又来个linux。万事开头难,对于java开发者对运维也有一定的要求,所以linux这块还是要抱着怀抱之心吧,可以先从服务器或者双系统,又或者虚拟机入手。服务器服务器的选择感觉服务器还是阿里...

weixin_39932330的博客 464

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

四种高效搭建SpringBoot项目的方式详解

SpringBoot作为当前Java领域最流行的微服务框架,以其"约定优于配置"的理念和快速开发特性深受开发者喜爱。本文将详细介绍四种搭建SpringBoot项目的方式,帮助初学者快速上手,同时也为有经验的开发者提供更多选择方案。掌握多种SpringBoot项目创建方式能让你在不同场景下灵活选择最合适的方法。对于新手,建议从前两种方式开始;对于有经验的开发者,理解第四种方式有助于深入掌握SpringBoot的运作机制。无论哪种方式,SpringBoot都能帮助你快速构建健壮的Java应用。

m0_62910542的博客 1409

SpringBoot + MySQL + Echarts数据可视化

本博文主要讲解如何从数据库里获取数据进行可视化。具体方式为:数据存在MySQL数据库里,通过SpringBoot和Mybatis-Plus搭建后台,提供接口给前端调用,前端用Echarts实现数据可视化。 环境准备 JDK1.8 Maven3.3.9 MySQL5.7 IDEA 建库建表 新建名为test的数据库 CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 新建stu表及

大头皮鞋的博客 2万+

自己动手用Springboot实现仿百度网盘

本项目基于Springboot开发实现,前端采用BootStrap开发实现,系统功能完整,交互性好,模仿百度网盘实现相关功能,比较适合做毕业设计使用,创意性强。 开发工具为IDEA或ECLIPSE,数据库采用MYSQL数据库。

软件开发实战项目分享 6230

实现springBoot+vue系统项目时遇到的问题及解决方法

将项目下的.idea文件删除,重新在ideal打开加载项目。

xxyxxxqqq的博客 1014

如何用JarEditor插件快速修改SpringBoot JAR包?5分钟掌握核心操作

还在为修改SpringBoot JAR包而烦恼吗?每次都要解压、修改、重新打包,流程繁琐又容易出错。今天我要向大家介绍一款终极神器——**JarEditor插件**,它能让你在IDEA中直接编辑JAR包内的文件,无需解压,5分钟就能掌握核心操作技巧!🚀 JarEditor是一款功能强大的IDEA插件,专门为Java开发者设计,让你能够直接在IDE中修改JAR包内的class文件和资源文件,支持

gitblog_00223的博客 773

Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(3)

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

m0_60635176的博客 1054

VSCode开发SpringBoot项目全攻略

现代Java开发中,轻量级编辑器与框架的深度整合正成为趋势。通过Language Server Protocol(LSP)实现的智能代码补全,结合构建工具如Maven/Gradle的项目管理能力,开发者可以搭建高效的开发环境。VSCode凭借其扩展体系,特别是Java Extension Pack和Spring Boot Tools插件,为SpringBoot开发提供了接近专业IDE的体验。在微服务架构下,快速启动和低资源消耗的特性使VSCode成为持续集成场景的理想选择。本文以SpringBoot 3.x

weixin_33797791的博客 442
上一篇: 【uni-app】页面跳转第一次不闪白第二次闪白
下一篇: gitlab 502 解决方案
BlessingDN
博客等级 码龄9年 3粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值