IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Zip】使用 SpringBoot 实现 zip文件的导入和导出 -> 正文阅读

[Java知识库]【Zip】使用 SpringBoot 实现 zip文件的导入和导出

了解到有两种解压 zip 文件的方式:org.apache.tools.zip.ZipFile ;SpringBoot 自带的 net.lingala.zip4j.core.ZipFile。这里选择第二种。

引入 POM 依赖:

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

1. Zip 文件导入

FileController 添加一个接口:

@PostMapping("/importZipFile")
public ResultVo<String> importZipFile(@RequestParam("zipFile") MultipartFile zipFile) {
    return fileService.importZipFile(zipFile);
}

FileServiceImpl

public ResultVo<String> importZipFile(MultipartFile zipFile) {
    // 1.校验入参
    ResultVo<String> resultVo = checkZipFileParam(zipFile);
    if (!resultVo.checkSuccess()) {
        return resultVo;
    }
    // 2.上传至服务器路径下
    ResultVo<String> uploadFileResultVo = uploadFile(zipFile);
    if (!uploadFileResultVo.checkSuccess()) {
        return uploadFileResultVo;
    }
    // 3.解压Zip文件
    String uploadZipFilePath = uploadFileResultVo.getData();
    boolean unPackZip = FileUtil.unPackZip(new File(uploadZipFilePath), "", FileUtil.getUploadZipPath(), true);
    if (!unPackZip) {
        return ResultVoUtil.error("【导入Zip文件】失败");
    }
    log.info("【导入Zip文件】成功");
    return ResultVoUtil.success("【导入Zip文件】成功");
}

checkZipFileParam():校验Zip文件的入参

public ResultVo<String> checkZipFileParam(MultipartFile zipFile) {
    if (Objects.isNull(zipFile)) {
        return ResultVoUtil.error("【导入Zip文件】缺少Zip包");
    }
    String contentType = zipFile.getContentType();
    if (!FileConstant.CONTENT_TYPE_ZIP.equals(contentType) && !FileConstant.CONTENT_TYPE_ZIP_COMPRESSED.equals(contentType)) {
        return ResultVoUtil.error("【导入Zip文件】上传的文件类型不是Zip");
    }
    return ResultVoUtil.success();
}

FileConstant:文件常量类

public interface FileConstant {

    // UTF-8 字符集
    String UTF8 = "UTF-8";

    // GBK
    String GBK = "GBK";

    // 文件类型 <application/zip>
    String CONTENT_TYPE_ZIP = "application/zip";

    // 文件类型 <application/x-zip-compressed>
    String CONTENT_TYPE_ZIP_COMPRESSED = "application/x-zip-compressed";

}

FileUtil.unPackZip():解压

public static boolean unPackZip(File zipFile, String password, String desPath, boolean isDel) {
    try {
        ZipFile zip = new ZipFile(zipFile);
        // 这里是windows系统上传,所以,就用 GBK 编码咯
        zip.setFileNameCharset(FileConstant.GBK);
        log.info("【文件解压】begin unpack zip file....");
        // 将文件输出到目标目录
        zip.extractAll(desPath);
        if (zip.isEncrypted()) {
            zip.setPassword(password);
        }
    } catch (ZipException e) {
        log.error("【文件解压】异常,路径:{} ,异常信息:{} ", desPath, e);
        return false;
    }
    if (isDel) {
        zipFile.deleteOnExit();
    }
    return true;
}

说明:

  1. 解压缩时,需要设置文件编码的类型。Linux/Mac 系统默认是 UTF-8windows 系统默认是 GBK
  2. deleteOnExit():在虚拟机终止时,请求删除此抽象路径名表示的文件或目录;delete() 方法:直接删除

getUploadZipPath():获取Zip文件上传路径

public static String getUploadZipPath() {
    return fileConfig.getUploadZipPath();
}

FileConfig:添加一个属性

public class FileConfig {

    // 上传路径
    private String uploadPath;

    // 下载路径
    private String downloadPath;

    // 上传Zip文件路径
    private String uploadZipPath;

}

application.yml

file:
  uploadPath: E:/upload
  downloadPath: E:/download
  uploadZipPath: E:/uploadZipPath

2. Zip 导出

FileController:添加一个Zip文件下载接口

@PostMapping("/exportZipFile")
public ResultVo exportZipFile(final HttpServletResponse response) {
    return fileService.exportZipFile(response);
}

FileServiceImpl:导出Zip文件

public ResultVo<String> exportZipFile(HttpServletResponse response) {
    // 1.根据条件找到要压缩的文件/目录或者自己生成文件/目录(这里写死)
    String srcPath = getSrcPathByCondition();
    // 2.压缩文件
    String desPath = FileUtil.packZip(srcPath, FileUtil.getDownloadZipPath(), false, null);
    if (StringUtil.isBlank(desPath)) {
        log.error("【文件压缩】压缩失败");
        return ResultVoUtil.error("【文件压缩】压缩失败");
    }
    log.info("【文件压缩】压缩成功,压缩文件路径为:{}", desPath);
    // 3.下载Zip文件
    ResultVo<String> downLoadZipResultVo = downloadFile(desPath, response);
    if (null != downLoadZipResultVo && !downLoadZipResultVo.checkSuccess()) {
        log.error("【导出Zip文件】下载文件失败");
        return downLoadZipResultVo;
    }
    // 4.删除Zip文件
    boolean deleteFile = FileUtil.deleteFile(new File(desPath));
    if (!deleteFile) {
        log.error("【下载Zip文件】删除临时文件失败,临时文件路径为{}", desPath);
        return ResultVoUtil.error("删除临时文件失败");
    }
    log.info("【下载Zip文件】删除临时文件成功,临时文件路径为:{}", desPath);
    return null;
    
}

getSrcPathByCondition():获取要压缩的源路径

// 获取要压缩的源路径
public String getSrcPathByCondition() {
    return "E:/upload/2021-11-11";
}

FileUtil.packZip():压缩Zip文件。对于给定的文件(夹)压缩到指定位置

public static String packZip(String srcPath, String desPath, boolean isCreateDir, String password) {
    File srcFile = new File(srcPath);
    desPath = buildDestinationZipFilePath(srcFile, desPath);
    ZipParameters parameters = new ZipParameters();
    // 压缩方式
    parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
    // 压缩级别
    parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
    if (!StringUtil.isBlank(password)) {
        parameters.setEncryptFiles(true);
        // 加密方式
        parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
        parameters.setPassword(password.toCharArray());
    }

    try {
        ZipFile zipFile = new ZipFile(desPath);
        log.info("【文件压缩】begin pack zip file....");
        if (srcFile.isDirectory()) {
            if (!isCreateDir) {
                // 如果不创建目录的话,将直接把源目录下的文件给压缩
                File[] subFiles = srcFile.listFiles();
                ArrayList<File> files = new ArrayList<>();
                Collections.addAll(files, subFiles);
                zipFile.addFiles(files, parameters);
            } else {
                zipFile.addFolder(srcFile, parameters);
            }
        } else {
            zipFile.addFile(srcFile, parameters);
        }
        return desPath;
    } catch (ZipException e) {
        log.error("【压缩ZiP文件】失败,失败信息为:{}", e);
        return null;
    }
}

buildDestinationZipFilePath():构建压缩文件存放路径

public static String buildDestinationZipFilePath(File srcFile,String destParam) {
    if (!StringUtil.isBlank(destParam) && destParam.endsWith(FileConstant.ZIP_FILE_SUFFIX)) {
        return destParam;
    }
    if (srcFile.isDirectory()) {
        destParam = srcFile.getParent() + File.separator + srcFile.getName() + FileConstant.ZIP_FILE_SUFFIX;
    } else {
        String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));
        destParam = srcFile.getParent() + File.separator + fileName + FileConstant.ZIP_FILE_SUFFIX;
    }
    return destParam;
}

FileConstant

public interface FileConstant {

	...

    // 文件分隔符
    String FILE_SPLIT = "/";

}

FileConfig:

public class FileConfig {

    ...

    // 下载Zip文件路径
    private String downloadZipPath;

}

application.yml

file:
  uploadPath: E:/upload
  downloadPath: E:/download
  uploadZipPath: E:/uploadZipPath
  downloadZipPath: E:/downloadZipPath
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:30:07  更:2021-11-19 17:30:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:08:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码