首页 > 编程语言 >java实现上传zip解压及判断压缩包文件夹功能

java实现上传zip解压及判断压缩包文件夹功能

时间:2023-07-10 10:36:30浏览次数:43  
标签:文件 java String zip ze File new 压缩包


直接上Service,通过代码看思路贯穿整个功能,很多工具类可以复用,文件路径可以去看我博客里的

(使用ResourceBundle国际化资源文件读取properties详解) 这篇制作方法

url:

html页面

<span>ZIP:</span> <input type="file" style="width: 170px"  name="hostFileBatch"/><span id="hostCheckResult"></span><br/>  
 <input type="button" value="确认上传" onclick="checkHostBatchRun()"/> 
 <input type="button" value="运行"  onclick="hostRun()" id="hostRunResult" disabled="disabled" > 
 <span id="hostResult"></span>

页面js

function checkHostBatchRun(){
	
if(confirm("上传重名文件将会替换掉原有文件,是否继续上传?")){
	//年
	var hostYear=$("#hostYear").val();
	//季度
	var quarter=$("#hostQuarter").find("option:selected").text();

 	$.ajax({
		type : "POST",
		cache : false,
		dataType : "json",
		data:new FormData($('#hostUploadForm')[0]),
        processData: false,//用于对data参数进行序列化处理 这里必须false
        contentType: false, //必须 ?hostYear="+hostYear+"&quarter="+quarter"
		url : "../uploadController/hostUploadZipBatchRun.htm?hostYear="+hostYear+"&&quarter="+quarter+" ",
		success : function(obj) {
			/* alert(obj.data.msg); */
			var result=obj.data.msg;
			if(result==true){
				$("#hostCheckResult").text("上传成功!").css("color","blue");
				$("#hostRunResult").attr("disabled",false);
			}else{
				$("#hostCheckResult").text("上传失败!").css("color","red");
			}
			
		}
	});	
   }
	
}

Service

//创建解析器
		MultipartHttpServletRequest mh=(MultipartHttpServletRequest) request;
		//获得文件  
		CommonsMultipartFile cmf=(CommonsMultipartFile) mh.getFile("hostFileBatch");
		//获得原始文件名
		String oriName=cmf.getOriginalFilename(); 
		//拼接年+月
		String path=hostYear.concat(quarter);
//		String path=String.valueOf(year).concat(String.valueOf(month));
		String savePath=Commons.HOST_UPLOAD_PATH+"\\"+path; //保存的路径
//		File storeDirectory=new File(savePath);  
		//判断是不是zip文件
		if(oriName.matches(".*.zip")) {		
			//判断文件目录是否存在
			File file=new File(savePath);
			//不存在 
			if(!file.exists()) {
				//创建文件夹
				file.mkdirs();
			}else {	
				//文件存在则删除
				deleteDir(file);
//				file.delete();
				file.mkdirs(); 
				//删除文件原始路径
				int deletePath=uploadZipDao.deleteOldFile(oriName,savePath);
			}
			//获取文件
			FileItem fileItem=cmf.getFileItem();  
			try {	
                //文件保存到目录然后解压↓
				fileItem.write(new File(file,oriName));
				//解压文件到指定目录
				FileUnZip.zipToFile(oriName, savePath);
                //删除原上传的文件
				FileUtil.delFile(savePath+File.separator+oriName);
			} catch (Exception e){
				e.printStackTrace();  
				new File(savePath,oriName).delete();  
			}
			fileItem.delete();	
			//保存路径文件名
			boolean result=addPath(oriName,savePath);
			if(result==true) {
				//执行批处理	
				return true;		
			}
			return false;
		}else {
			//不是zip则返回false
			return false;
		}	
	}

解压工具类

package cn.secure.util;

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.util.Enumeration;

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

public class FileUnZip {
	/**
     * 解压zip文件
     * @author 于公成
     * @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");// 连接待解压文件 "utf-8"会乱码
			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;
    }
    

    
    
}

 

文件递归删除工具类(file.delete方法必须文件为空才能删除,所以用这个递归方法删)

 

/**
     * 递归删除目录下的所有文件及子目录下所有文件
     * @param dir 将要删除的文件目录
     */
    private 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(); 
    }

判断zip压缩包是否有文件夹思路

eg:所内 所外俩个文件夹

/**
	 * 判断是否存在所内所外俩个文件夹
	 * @param oriName
	 * @param savePath
	 * @return
	 * @throws Exception
	 */
	private boolean hasFileDirectory(String oriName, String savePath) throws Exception {
		  ZipFile zfile = new ZipFile(oriName, "gbk");// 连接待解压文件 "utf-8"会乱码
	        Enumeration zList = zfile.getEntries();// 得到zip包里的所	有元素
	        ZipEntry ze = null;
	        int count = 0;
	        while (zList.hasMoreElements()) {
	            ze = (ZipEntry) zList.nextElement();
	            if (ze.isDirectory()) {
	            	if(ze.getName().equals("所内/")) {
	            		count+=1;
	            	}
	            	if(ze.getName().equals("所外/")) {
	            		count+=1;
	            	}
	            }
	                // log.info("打开zip文件里的文件夹:"+ ze.getName() +"skipped...");	      
	         }
	        if(count==2) {
	        	return true;
	        }
		return false;
	}

 

标签:文件,java,String,zip,ze,File,new,压缩包
From: https://blog.51cto.com/kero99/6674341

相关文章

  • Java获取名字首字母拼音及用户按名字拼音分组工具
    一、需求分析最近在做一个类似于微信用户通讯录的功能,所以考虑通过查找的好友列表,在后台遍历按照26个字母分组,前台获取到Json循环26个字母直接解析对应的字符下的名称为一组分隔,没有则不显示,工具如下↓二、引入Pom<dependency> <groupId>com.belerweb</groupId> <artif......
  • Java大厂面试必考真题算法篇(持续更新)十一、java 统计字符串中每个字符出现的次数
    一、写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。答案importjava.util.*;publicclassSolution{/***反转字符串*@paramstrstring字符串*@returnstring字符串*/publicStringsolve(Stringstr){if(str......
  • java使用百度翻译接口实现前后端翻译功能
    java 百度翻译工具类 分别有前端和后端的 例子及工具使用百度翻译接口需要网上申请key,代码里面有URL。packagecn.secure.util;importjava.io.BufferedReader;importjava.io.Closeable;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStrea......
  • java 线程等待和唤醒方法
    java线程状态变迁图从图中可以看出Java线程等待方法是将线程从Runnable状态转换为Waiting状态,Java线程的唤醒方法是将线程从Waiting状态唤醒进入Runnable状态在Java中线程的等待和唤醒主要是分为3组:Object.wait()和Object.notify()LockSupport.park()和LockSupport.unp......
  • Java自签名证书的信任处理
    一、概要1.问题的由来该问题是由于Java访问的域名是https且使用了自签名证书,Java客户端无法验证证书的合法性,进而报出异常。该问题有以下解决思路:a.在Java客户端忽略证书的校验,这种方式适用于自己掌握Code的情况,且客户端服务端处于互相信任的环境中;b.将服务端的自签名证......
  • 【java】数组的常用操作
    sortstaticvoidsort(int[]a):将a数组按照从小到大进行排序staticvoidsort(int[]a,intfromIndex,inttoIndex):将a数组的[fromIndex,toIndex)部分按照升序排列staticvoidsort(Object[]a):根据元素的自然顺序对指定对象数组按升序进行排序。static<T>voidsort(T......
  • 暗黑2能用Java开发?还能生成APP?
    最近烧哥发现个宝藏项目,竟然用Java开发了暗黑2出来。众所周知,暗黑2是暴雪开发的一款经典游戏,距今虽有20多年,仍然有很多粉丝。粉丝延续热情的方式有很多,一种是做Mod,比如魔电,对怪物、技能、物品、场景、甚至游戏机制都有大改,目前还在定期更新,并有战网提供。另一种是纯怀旧,用另......
  • Java虚拟机(JVM):第四幕:自动内存管理 - 经典垃圾收集器
    前言:如果说收集算法是内存回收的方法论,那么垃圾收集器则是内存回收的实践者。整哥Java堆:FullGC。1、Serial收集器:最基础、历史最悠久的收集器,这是一个单线程工作的收集器。2、ParNew收集器:是Serial收集器的多线程并行版本,可以说是跟Serial完全一样。CMS收集......
  • 开心档之Java 测验
    目录Java测验 Java测验Java测验技术文档Java测验是一种衡量Java编程水平的测试,可以通过一系列问题和编程任务来测试Java开发人员的技能水平和理解程度。Java测验可以用于聘用程序员、衡量编程实践水平和掌握Java的程度。Java测验通常涵盖以下主题:基本语法-测试Ja......
  • Mac中使用命令行来加密压缩zip文档
    背景最近需要对一些文件加密,但是Mac上没有找到相应的加密工具,macOS中创建密码保护的压缩zip文件很容易并且不需要任何额外附加物或下载。使用命令行的方式处理即可。对压缩包加密之后便意味着有人想要解压缩zip文件时,必须输入正确的密码才能取出归档文件。命令压缩文件时带入......