在pom中添加解压jar依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.hf</groupId><artifactId>uncompress</artifactId><version>0.0.1-SNAPSHOT</version><name>uncompress</name><description>上传压缩文件(rar或者zip格式),解压</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--从Zip文件创建,添加,提取,更新,删除文件读/写密码保护的Zip文件支持AES 128/256加密支持标准邮​​编加密支持Zip64格式支持存储(无压缩)和Deflate压缩方法从Split Zip文件创建或提取文件(例如:z01,z02,... zip)支持Unicode文件名进度监视器--><!--zip4j依赖,解压zip压缩--><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version></dependency><!--解压rar压缩--><dependency><groupId>com.github.junrar</groupId><artifactId>junrar</artifactId><version>0.7</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

解压zip/rar的工具类

package com.hf.uncompress.utils;import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import lombok.extern.slf4j.Slf4j;
import net.lingala.zip4j.core.ZipFile;import java.io.File;
import java.io.FileOutputStream;/*** @Description: 解压rar/zip工具类* @Date: 2019/1/22* @Auther:*/
@Slf4j
public class UnPackeUtil {/*** zip文件解压** @param destPath 解压文件路径* @param zipFile  压缩文件* @param password 解压密码(如果有)*/public static void unPackZip(File zipFile, String password, String destPath) {try {ZipFile zip = new ZipFile(zipFile);/*zip4j默认用GBK编码去解压,这里设置编码为GBK的*/zip.setFileNameCharset("GBK");log.info("begin unpack zip file....");zip.extractAll(destPath);// 如果解压需要密码if (zip.isEncrypted()) {zip.setPassword(password);}} catch (Exception e) {log.error("unPack zip file to " + destPath + " fail ....", e.getMessage(), e);}}/*** rar文件解压(不支持有密码的压缩包)** @param rarFile  rar压缩包* @param destPath 解压保存路径*/public static void unPackRar(File rarFile, String destPath) {try (Archive archive = new Archive(rarFile)) {if (null != archive) {FileHeader fileHeader = archive.nextFileHeader();File file = null;while (null != fileHeader) {// 防止文件名中文乱码问题的处理String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() : fileHeader.getFileNameW();if (fileHeader.isDirectory()) {//是文件夹file = new File(destPath + File.separator + fileName);file.mkdirs();} else {//不是文件夹file = new File(destPath + File.separator + fileName.trim());if (!file.exists()) {if (!file.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录.file.getParentFile().mkdirs();}file.createNewFile();}FileOutputStream os = new FileOutputStream(file);archive.extractFile(fileHeader, os);os.close();}fileHeader = archive.nextFileHeader();}}} catch (Exception e) {log.error("unpack rar file fail....", e.getMessage(), e);}}
}

页面HTML

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="./jquery-3.2.1.min.js" type="text/javascript"></script><!--<script type="text/javascript">$("#ok").click(function () {alert(1);});</script>-->
</head>
<body>
<form action="/user/upload/zip" method="post" enctype="multipart/form-data">上传压缩包:<input type="file" name="zipFile"/>解压路径:<input type="text" name="destPath"/>解压密码(为空可不传):<input type="text" name="password"/></br><button id="ok" value="测试"></button><input type="submit" value="执行操作"/>
</form>
</body></html>

controller代码:

package com.hf.uncompress.controller;import com.hf.uncompress.Result.AjaxList;
import com.hf.uncompress.service.FileUploadService;
import com.hf.uncompress.vo.PackParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;/*** @Description:* @Date: 2019/1/22* @Auther: */@Controller
@RequestMapping("/user")
@Slf4j
public class FileUploadController {@Autowiredprivate FileUploadService fileUploadService;@GetMapping("/redirect")public String redirectHtml() {return "work";}@PostMapping("/upload/zip")@ResponseBodypublic String uploadZip(MultipartFile zipFile, @RequestBody PackParam packParam) {AjaxList<String> ajaxList = fileUploadService.handlerUpload(zipFile, packParam);return ajaxList.getData();}
}

service实现类代码

package com.hf.uncompress.service.impl;import com.hf.uncompress.Result.AjaxList;
import com.hf.uncompress.enums.FileTypeEnum;
import com.hf.uncompress.service.FileUploadService;
import com.hf.uncompress.utils.UnPackeUtil;
import com.hf.uncompress.vo.PackParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;/*** @Description:* @Date: 2019/1/22* @Auther: */
@Service
@Slf4j
public class FileUploadServiceImpl implements FileUploadService {@Overridepublic AjaxList<String> handlerUpload(MultipartFile zipFile, PackParam packParam) {if (null == zipFile) {return AjaxList.createFail("请上传压缩文件!");}boolean isZipPack = true;String fileContentType = zipFile.getContentType();//将压缩包保存在指定路径String packFilePath = packParam.getDestPath() + File.separator + zipFile.getName();if (FileTypeEnum.FILE_TYPE_ZIP.type.equals(fileContentType)) {//zip解压缩处理packFilePath += FileTypeEnum.FILE_TYPE_ZIP.fileStufix;} else if (FileTypeEnum.FILE_TYPE_RAR.type.equals(fileContentType)) {//rar解压缩处理packFilePath += FileTypeEnum.FILE_TYPE_RAR.fileStufix;isZipPack = false;} else {return AjaxList.createFail("上传的压缩包格式不正确,仅支持rar和zip压缩文件!");}File file = new File(packFilePath);try {zipFile.transferTo(file);} catch (IOException e) {log.error("zip file save to " + packParam.getDestPath() + " error", e.getMessage(), e);return AjaxList.createFail("保存压缩文件到:" + packParam.getDestPath() + " 失败!");}if (isZipPack) {//zip压缩包UnPackeUtil.unPackZip(file, packParam.getPassword(), packParam.getDestPath());} else {//rar压缩包UnPackeUtil.unPackRar(file, packParam.getDestPath());}return AjaxList.createSuccess("解压成功");}
}

使用到的枚举类:

package com.hf.uncompress.enums;import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;/*** @Description: 压缩文件类型* @Date: 2019/1/22* @Auther:*/
@AllArgsConstructor
@NoArgsConstructor
public enum FileTypeEnum {FILE_TYPE_ZIP("application/zip", ".zip"),FILE_TYPE_RAR("application/octet-stream", ".rar");public String type;public String fileStufix;public static String getFileStufix(String type) {for (FileTypeEnum orderTypeEnum : FileTypeEnum.values()) {if (orderTypeEnum.type.equals(type)) {return orderTypeEnum.fileStufix;}}return null;}
}

同一返回值定义:

package com.hf.uncompress.Result;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @Description: 返回值处理* @Date: 2019/1/22* @Auther: */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class AjaxList<T> {private boolean isSuccess;private T data;public static <T> AjaxList<T> createSuccess(T data) {return new AjaxList<T>(true, data);}public static <T> AjaxList<T> createFail(T data) {return new AjaxList<T>(false, data);}
}

前端上传封装的vo

package com.hf.uncompress.vo;import lombok.Data;/*** @Description: 上传压缩的参数* @Date: 2019/1/23* @Auther: */
@Data
public class PackParam {/*** 解压密码*/private String password;/*** 解压文件存储地址*/private String destPath;
}

在application.properties中定义其上传的阀域

#设置上传单个文件的大小限制
spring.servlet.multipart.max-file-size=500MB
# 上传文件总的最大值
spring.servlet.multipart.max-request-size=500MB
spring.thymeleaf.cache=false

java实现上传zip/rar压缩文件,自动解压相关推荐

  1. java上传rar文件_java实现上传zip/rar压缩文件,自动解压

    在pom中添加解压jar依赖 4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.2.RELEASE com.hf uncomp ...

  2. Mac上zip,rar,tar文件命令解压和压缩

    经常遇到在windowns上的压缩文件,在mac上解压出现问题,特意总结了下在Terminal里常用命令的方式解压和压缩文件 1.zip压缩文件 zip命令的参数很多,可以利用"zip -- ...

  3. 【方法】ZIP分卷压缩文件如何解压?

    有时候文件太大,我们在压缩ZIP文件时会使用分卷压缩. 那后期想要解压ZIP分卷文件,要如何解压呢?不清楚的小伙伴,可以跟着小编来看看哦. 在解压ZIP分卷压缩文件之前,要先确保所有的分卷压缩包都存放 ...

  4. 最近很火的在线文件预览txt、doc、ppt、pdf、excel、jpg、png、zip、tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写搜索引擎多关键词检索名称和内容(四)

    最近很火的在线文件预览txt.doc.ppt.pdf.excel.jpg.mp4.png.zip.tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写一个文件搜索引擎实现多关键词 ...

  5. 最近很火的在线文件预览txt、doc、ppt、pdf、excel、jpg、png、zip、tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写搜索引擎多关键词检索名称和内容(五)

    最近很火的在线文件预览txt.doc.ppt.pdf.excel.jpg.mp4.png.zip.tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写一个文件搜索引擎实现多关键词 ...

  6. Zip压缩文件没有解压密码怎么办?

    Zip压缩文件没有解压密码怎么办? 在平时,我们难免的需要到浏览器上面寻找一些需要的资源,可往往下载好了zip文件后,解压时却需要密码.真的让人很痛苦.那有没有什么办法可以破解zip解压时需要的密码呢 ...

  7. linux下tar gz bz2 tgz z等众多压缩文件的解压方法

    对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见 的压缩文件就只有两种,一是,zip,另一个是.rar. ...

  8. linux解压文件卡住,Linux系统下常见的压缩文件及解压方法

    如果tar不支持j这个参数就先用 bzip2 -d xxx.tar.bz2 把它解压成.tar文件,然后再用 tar xvf xxx.tar 拆包. 压缩解压 linux下怎么解后缀名是gzip的文件 ...

  9. Linux之zip加密压缩与解密解压(一百二十一)

    Linux之zip加密压缩与解密解压 1.zip加密压缩目录 # zip -rP Abc#123 tmp.zip test/2.unzip解密解压缩 # unzip -P Abc#123 tmp.zi ...

最新文章

  1. 在计算机网络中光缆的工作原理是什么,计算机网络原理期中考试试卷(A)
  2. php扩展mongodb模块安装
  3. [转]Docker基础-使用Dockerfile创建镜像
  4. vue单向数据流与双向绑定两者区别
  5. 爱吃苹果的与喜欢篮球的没必要非得达成一致~
  6. Discovering versions from the identity service failed when creating the password plugin.
  7. 14-多对多关系建表
  8. asterisk1.8启动信息分析(未完)
  9. java 调度框架_java调度框架Quartz(一)
  10. JavaBean规范、EL、JSTL、
  11. Spring-AbstractRefreshableApplicationContext
  12. 云智慧获 D 轮数 2500 万美元投资:全力推动智能运维落地
  13. 关于海康威视sdk与海康威视web的史上最精细的教程 (一)
  14. 微型计算机原理与接口技术AD实验报告,微机原理与接口技术AD转换综合实验报告.doc...
  15. 固有模态函数IMF与经验模态分解EMD
  16. 网络远程控制原理及技术实现
  17. 使用OpenResty控制CDN回源主机
  18. 设计模式 装饰模式(decorate)
  19. 上海小伙三次成功创业,资产达上十亿被称为“创业神童”
  20. Android 7.1开机之后APN的加载及拨号上网流程分析

热门文章

  1. DSS部署-12、DSS安装
  2. 4k 显示器放大 150% 和 23寸显示器组双屏抓图问题解决
  3. 利用photoshop cs5新增功能之“智能填充
  4. php大文件读取excel分割,如何用phpspreadsheet来切割excel大文件(附代码)
  5. Nginx的 allow / deny 理解
  6. 整车nvh培训入门 仿真 ,基于Hyperworks 掌握思路 细节
  7. 【黄啊码】vue-pdf预览时无法显示印章和中文字体或者乱码(简单粗暴)
  8. 一口气推荐16个让人震惊的黑科技工具
  9. 二阶常系数非齐次线性微分方程的通解
  10. MBR陶瓷膜原料,MBR陶瓷膜堵塞了怎么清理-世来福