ZIpFile.entries() 获取的是压缩包内的所有文件(包括文件夹),不只是第一层的文件(和文件夹)
如果是用MultipartFile接收的Zip文件,需要先保存到本地 ,然后再解析:
/**
* MultipartFile存本地
* @param file 要保存到本地的文件
* */
public static void saveMultipartFile(MultipartFile file) throws IOException{
//创建根目录
String savePath = "D:\\temp" ;
File localFile = new File(savePath+File.separator+file.getOriginalFilename());
localFile.mkdirs();
file.transferTo(localFile);
}
解析zip文件并复制文件:
/**
* @param srcFile zip源文件
* @param savePath 文件保存路径
* @throws RuntimeException 解压失败会抛出运行时异常
* */
public static void resolveZip(File srcFile,String savePath) {
//解压文件
ZipFile zipFile = null;
try {
zipFile = new ZipFile(srcFile, Charset.forName("GBK"));
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while(entries.hasMoreElements()){
ZipEntry zipEntry = entries.nextElement();
//判断是文件夹 或者 文件
if(zipEntry.isDirectory()){
continue;
}else{
//保存到本地
String fileName = zipEntry.getName();
//获取的文件,如果存在父级,文件名会显示父级路径,所有我们需要手动去掉
if(fileName.lastIndexOf("/") != -1){
fileName = fileName.substring(fileName.lastIndexOf("/")+1);
}
File shpFile = new File(savePath + File.separator+fileName);
shpFile.createNewFile();
copyFile(zipFile.getInputStream(zipEntry),new FileOutputStream(shpFile));
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(zipFile!=null){
try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
文件复制公共方法:
/**
* 复制文件
* @param in 原文件流输入流
* @param out 目标文件输出流
* */
public static void copyFile(InputStream in, OutputStream out) {
int len ;
byte[] b = new byte[1024];
try {
while ((len = in.read(b,0,1024))!=-1){
out.write(b,0,len);
out.flush();
}
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}