Java 解压压缩文件,springMVC 接收压缩文件

解压 zip,rar 类型的压缩文件

1、首先需要 jar 包


ant-1.6.5.jar :解压zip格式的压缩文件

junrar-0.7.jar :解压rar 格式

如果是 maven  :

<dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.6.5</version>
        </dependency>
        <dependency>
            <groupId>com.github.junrar</groupId>
            <artifactId>junrar</artifactId>
            <version>0.7</version>
        </dependency>

加入 springMVC的jar包

2、工具类,

2.1、

网上好多,这里是有2个解压zip 的(一个有编码设置,一个没有编码设置)

2个 解压rar的,(一个有编码设置,一个没有编码设置)

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Enumeration;
import java.util.zip.ZipOutputStream;

import javax.servlet.http.HttpServletRequest;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;

public class CompressFileUtils {
	
	public static void unZipFiles(HttpServletRequest request, String zipPath,
			String descDir) throws IOException {
		unZipFiles(request, new File(zipPath), descDir);
	}

	/**
	 * 解压文件到指定目录
	 * 
	 */
	@SuppressWarnings("rawtypes")
	public static void unZipFiles(HttpServletRequest request, File zipFile,
			String descDir) throws IOException {
		request.setCharacterEncoding("utf-8");
		File pathFile = new File(descDir);
		if (!pathFile.exists()) {
			pathFile.mkdirs();
		}
		ZipFile zip = new ZipFile(zipFile);
		for (Enumeration entries = zip.getEntries(); entries.hasMoreElements();) {
			ZipEntry entry = (ZipEntry) entries.nextElement();
			entry.setUnixMode(644); // 解决linux乱码
			String zipEntryName = entry.getName();
			InputStream in = zip.getInputStream(entry);

			BufferedInputStream bis = new BufferedInputStream(in);

			String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
			;
			// 判断路径是否存在,不存在则创建文件路径
			File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
			if (!file.exists()) {
				file.mkdirs();
			}
			// 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
			if (new File(outPath).isDirectory()) {
				continue;
			}
			// 输出文件路径信息
			System.out.println(outPath);

			OutputStream out = new FileOutputStream(outPath);
			Writer out1 = new OutputStreamWriter(out, "UTF-8");
			byte[] buf1 = new byte[1024];
			int len;
			while ((len = in.read(buf1)) > 0) {
				out.write(buf1, 0, len);
			}
			in.close();
			out.close();
		}
		System.out.println("******************解压完毕********************");
	}

	/**
	 * 根据原始rar路径,解压到指定文件夹下.
	 * 
	 * @param srcRarPath
	 *            原始rar路径
	 * @param dstDirectoryPath
	 *            解压到的文件夹
	 * @throws UnsupportedEncodingException
	 */
	public static void unRarFile(HttpServletRequest request, String srcRarPath,
			String dstDirectoryPath) throws UnsupportedEncodingException {
		request.setCharacterEncoding("utf-8");
		if (!srcRarPath.toLowerCase().endsWith(".rar")) {
			System.out.println("非rar文件!");
			return;
		}
		File dstDiretory = new File(dstDirectoryPath);
		if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
			dstDiretory.mkdirs();
		}
		Archive a = null;
		try {
			a = new Archive(new File(srcRarPath));
			if (a != null) {
				a.getMainHeader().print(); // 打印文件信息.
				FileHeader fh = a.nextFileHeader();
				while (fh != null) {
					String fileName = fh.getFileNameW().isEmpty()?fh.getFileNameString():fh.getFileNameW();
					System.out.println("fileName"+fileName);
					if (fh.isDirectory()) { // 文件夹
						File fol = new File(dstDirectoryPath + File.separator
								+ fileName);
						fol.mkdirs();
					} else { // 文件
						File out = new File(dstDirectoryPath + File.separator
								+ fh.getFileNameString().trim());
						// System.out.println(out.getAbsolutePath());
						try {// 之所以这么写try,是因为万一这里面有了异常,不影响继续解压.
							
							if (!out.exists()) {
								if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录.
									out.getParentFile().mkdirs();
								}
								out.createNewFile();
							}
							FileOutputStream os = new FileOutputStream(out);
							a.extractFile(fh, os);
							os.close();
						} catch (Exception ex) {
							ex.printStackTrace();
						}
					}
					fh = a.nextFileHeader();
				}
				a.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解压zip文件
	 * 
	 * @param sourceFile
	 *            ,待解压的zip文件; toFolder,解压后的存放路径
	 * @throws Exception
	 **/

	public static void zipToFile(String sourceFile, String toFolder)
			throws Exception {
		String toDisk = toFolder;// 接收解压后的存放路径
		ZipFile zfile = new ZipFile(sourceFile, "GBK");// 连接待解压文件
		Enumeration zList = zfile.getEntries();// 得到zip包里的所有元素
		ZipEntry ze = null;
		byte[] buf = new byte[1024];
		while (zList.hasMoreElements()) {
			ze = (ZipEntry) zList.nextElement();
			if (ze.isDirectory()) {
//				log.info("打开zip文件里的文件夹:" + ze.getName() + "skipped...");
				continue;
			}
			OutputStream outputStream = null;
			InputStream inputStream = null;
			try {
				// 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
				outputStream = new BufferedOutputStream(new FileOutputStream(
						getRealFileName(toDisk, ze.getName())));
				inputStream = new BufferedInputStream(zfile.getInputStream(ze));
				int readLen = 0;
				while ((readLen = inputStream.read(buf, 0, 1024)) != -1) {
					outputStream.write(buf, 0, readLen);
				}
				inputStream.close();
				outputStream.close();
			} catch (Exception e) {
//				log.info("解压失败:" + e.toString());
				throw new IOException("解压失败:" + e.toString());
			} finally {
				if (inputStream != null) {
					try {
						inputStream.close();
					} catch (IOException ex) {

					}
				}
				if (outputStream != null) {
					try {
						outputStream.close();
					} catch (IOException ex) {
						ex.printStackTrace();
					}
				}
				inputStream = null;
				outputStream = null;
			}

		}
		zfile.close();
	}

	/**
	 * 
	 * 给定根目录,返回一个相对路径所对应的实际文件名.
	 * 
	 * @param zippath
	 *            指定根目录
	 * 
	 * @param absFileName
	 *            相对路径名,来自于ZipEntry中的name
	 * 
	 * @return java.io.File 实际的文件
	 */

	private static File getRealFileName(String zippath, String absFileName) {
//		log.info("文件名:" + absFileName);
		String[] dirs = absFileName.split("/", absFileName.length());
		File ret = new File(zippath);// 创建文件对象
		if (dirs.length > 1) {
			for (int i = 0; i < dirs.length - 1; i++) {
				ret = new File(ret, dirs[i]);
			}
		}
		if (!ret.exists()) {// 检测文件是否存在
			ret.mkdirs();// 创建此抽象路径名指定的目录
		}
		ret = new File(ret, dirs[dirs.length - 1]);// 根据 ret 抽象路径名和 child
													// 路径名字符串创建一个新 File 实例
		return ret;
	}
	
	 /** 
     * 根据原始rar路径,解压到指定文件夹下.      
     * @param srcRarPath 原始rar路径 
     * @param dstDirectoryPath 解压到的文件夹      
     */
     public static void unRarFile2(String srcRarPath, String dstDirectoryPath) {
         if (!srcRarPath.toLowerCase().endsWith(".rar")) {
             System.out.println("非rar文件!");
             return;
         }
         System.out.println("dstDirectoryPath"+dstDirectoryPath);
         File dstDiretory = new File(dstDirectoryPath);
         if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
             dstDiretory.mkdirs();
         }
         Archive a = null;
         try {
             a = new Archive(new File(srcRarPath));
             if (a != null) {
                 //a.getMainHeader().print(); // 打印文件信息.
                 FileHeader fh = a.nextFileHeader();
                 while (fh != null) {
                          //防止文件名中文乱码问题的处理
                
String fileName = fh.getFileNameW().isEmpty()?fh.getFileNameString():fh.getFileNameW();
                     if (fh.isDirectory()) { // 文件夹 
                    File fol = new File(dstDirectoryPath + File.separator + fileName);
                       //  fol.mkdirs();
                     } else { // 文件
                    File out = new File(dstDirectoryPath + File.separator + fileName.trim());
                         try { 
                             if (!out.exists()) {
                                 if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录. 
                                     out.getParentFile().mkdirs();
                                 }
                                 out.createNewFile();
                             }
                             FileOutputStream os = new FileOutputStream(out);
                             a.extractFile(fh, os);
                             os.close();
                         } catch (Exception ex) {
                             ex.printStackTrace();
                         }
                     }
                     fh = a.nextFileHeader();
                 }
                 a.close();
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
}

2.2、

package com.yogapay.boss.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.disk.DiskFileItem;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;


public class UploadUtil {

	
	public static File[] resolveCompressUploadFile(HttpServletRequest request,
			MultipartFile file, String path) throws Exception {

		request.setCharacterEncoding("utf-8");
		/* 截取后缀名 */
		if (file.isEmpty()) {
			throw new Exception("文件不能为空");
		}
//		String fileName = file.getOriginalFilename();
		System.out.println("sssss"+file.getOriginalFilename());
		String fileName = new String(file.getOriginalFilename());
		System.out.println("fileName"+fileName);
		int pos = fileName.lastIndexOf(".");
		String extName = fileName.substring(pos + 1).toLowerCase();
		// 判断上传文件必须是zip或者是rar否则不允许上传
		if (!extName.equals("zip") && !extName.equals("rar")) {
			throw new Exception("上传文件格式错误,请重新上传");
		}
		// 时间加后缀名保存
		String saveName = "aaas" + "." + extName;
		// 根据服务器的文件保存地址和原文件名创建目录文件全路径
		File pushFile = new File(path + "/" + saveName);
		File descFile = new File(path);
		if (!descFile.exists()) {
			descFile.mkdirs();
		}
		// 解压目的文件
		String descDir = path + "/";
		System.out.println("desc:" + descDir);
		file.transferTo(pushFile);

		// 开始解压zip
		if (extName.equals("zip")) {
			CompressFileUtils.zipToFile(path + "/" + saveName, descDir);
		}else if (extName.equals("rar")) {
			// 开始解压rar
			CompressFileUtils.unRarFile2(pushFile.getAbsolutePath(), descDir);
		}   else {
			throw new Exception("文件格式不正确不能解压");
		}
		// 删除 解压完的压缩文件
		doDeleteEmptyDir(path + "/" + saveName);
		return returnFiles(descDir+"");
	}
	//返回 File[]
	public static File[] returnFiles(String strPath) {
		File dir = new File(strPath);
		File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				String fileName = files[i].getName();
				File f = new File(strPath + File.separator + fileName);
				System.out.println("文件名称:"+fileName);
				if (f.isDirectory()) {// 如果f是目录
					File[] newfiles = f.listFiles();
					return newfiles;
				}

			}
		}
		return files;
	}

	//删除指定文件
	private static void doDeleteEmptyDir(String dir) {
		boolean success = (new File(dir)).delete();
		if (success) {
			System.out.println("Successfully deleted empty directory: " + dir);
		} else {
			System.out.println("Failed to delete empty directory: " + dir);
		}
	}

	// 删除目录下的所有
	public static boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            //递归删除目录中的子目录下
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空,可以删除
        return dir.delete();
    }
	
	
	//保存file
	public static void saveFile(File file,String path,String name) throws IOException{
		FileInputStream fis = null;
		FileOutputStream fos = null;
		
		try {
			fis = new FileInputStream(file);
			fos = new FileOutputStream(path + File.separator
					+ name, true);
			int count = fis.available();// 获取这个文件里共有多少个字节
			byte[] b = new byte[count];
			int len = 0;
			while ((len = fis.read(b)) != -1) {
				fos.write(b);
			}
			//System.out.println("复制成功!");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (fis != null) {
					fis.close();
				}
				if (fos != null) {
					fos.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

3、controller

public String msave(final ModelMap model,	
			@RequestParam("zip") MultipartFile zip,
			HttpServletRequest request) throws SQLException,
			UnsupportedEncodingException {
					String path = request.getSession().getServletContext()
					.getRealPath("images"+File.separator+"jieya");
// 解压,
					File[] Files = UploadUtil.resolveCompressUploadFile(
							request, zip, path);
					if (UploadUtil.inspectFile(Files)) {
						// 保存,这里是将解压的文件保存到123目录下
						for (File file : Files) {
							System.out.println("file" + file.getName());
							if (!saveFile(file, request,
									"123")) {
								throw new Exception();
							}
						}
						System.out.println("删除文件");
						// 删除临时目录
						UploadUtil.deleteDir(new File(path));
					} else {
						System.out.println("文件类型错误");
						throw new Exception();
					}
}

4、jsp

<form action="" method="post" enctype="multipart/form-data">
上传压缩文件:<input id="file_upload" name="zip" type="file" /><input
				type="submit" value="提交" />
</form>



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值