SpringBoot(Java)实现zip、rar压缩包上传及解压
1、pom
引入解压相关压缩包:
<dependency> <groupId>com.github.junrar</groupId> <artifactId>junrar</artifactId> <version>7.4.1</version> </dependency> <dependency> <groupId>net.lingala</groupId> <artifactId>zip4j</artifactId> <version>1.3.3</version> </dependency>
2、工具类
编写工具类,实现对rar、zip压缩包的解压操作
import com.github.junrar.Archive;import com.github.junrar.rarfile.FileHeader;import net.lingala.zip4j.core.ZipFile;import org.slf4j.LoggerFactory;import org.slf4j.Logger;import java.io.File;import java.io.FileOutputStream;public class UnPackeUtil { private static final Logger logger = LoggerFactory.getLogger(UnPackeUtil.class); / * 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"); logger.info("begin unpack zip file...."); zip.extractAll(destPath); // 如果解压需要密码 if (password != null) { if (zip.isEncrypted()) { zip.setPassword(password); } } } catch (Exception e) { logger.error("解压失败:", 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) { logger.error("解压失败:", e.getMessage(), e); } }}
3、功能实现
public class Test{private final static String ZIP_FILE = "application/zip"; private final static String RAR_FILE = "application/vnd.rar";public void uploadPack(MultipartFile uploadFile) { boolean isZipPack = true;// 解压目录 String packFileStr = "D:\\zip"; //不存在则创建 File packFile = new File(packFileStr); if (!packFile.exists()) { boolean mkdirs = packFile.mkdirs(); } if (uploadFile== null) { throw new RuntimeException("请上传文件"); } String contentType = uploadFile.getContentType(); String filename = uploadFile.getOriginalFilename(); //将压缩包保存在指定路径 String packFilePath = packFileStr + File.separator + filename; if (ZIP_FILE.equals(contentType)) { //zip解压缩处理 } else if (RAR_FILE.equals(contentType)) { //rar解压缩处理 isZipPack = false; } else { throw new RuntimeException("上传的压缩包格式不正确,仅支持rar和zip压缩文件!"); } File file = new File(packFilePath); try { zipFile.transferTo(file); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("压缩文件到:" + packFileStr + " 失败!"); } if (isZipPack) { //zip压缩包 UnPackeUtil.unPackZip(file, null, packFileStr); } else { //rar压缩包 UnPackeUtil.unPackRar(file, packFileStr); } //获取压缩包名称 filename = filename.substring(0, filename.lastIndexOf(".")); System.out.println("解压成功,解压目录:" + packFilePath); //可以根据解压路径、压缩包名称、文件名称,取出对应文件进行操作 }}