文件压缩上传Utils
文件压缩上传utils
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.nio.charset.Charset; import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile; public class FileZipUtil { /** * 上传压缩文件到指定目录 * @param sealPfxFile * @param path 路径 * @return * @throws IOException */ public static String upload(File sealPfxFile, String path) throws IOException { long startTime=System.currentTimeMillis(); String fileName = sealPfxFile.getName(); File file = new File(path); try { if (!file.exists()) { file.mkdirs();// 创建一个已时间戳命名的文件夹 } // 获取输出流 OutputStream os = new FileOutputStream(path + fileName); // InputStream is = sealPfxFile.getInputStream(); InputStream is =new FileInputStream(sealPfxFile); int temp; // 一个一个字节的读取并写入 while ((temp = is.read()) != (-1)) { os.write(temp); } os.flush(); os.close(); is.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } long endTime=System.currentTimeMillis(); //获取结束时间 System.out.println("上传时间: "+(startTime-endTime)+"ms"); return path + fileName; } /** * 解压zip文件到指定的目录 * @param file 要解压的zip文件全路径 * @param outputDir 要解压到某个指定的目录下 * @throws IOException */ public static void unZip(String file, String outputDir) throws IOException { long startTime=System.currentTimeMillis(); ZipFile zipFile = null; try { Charset gbk = Charset.forName("gbk"); zipFile = new ZipFile(file, gbk); createDirectory(outputDir, null);// 创建输出目录 Enumeration<?> enums = zipFile.entries(); while (enums.hasMoreElements()) { ZipEntry entry = (ZipEntry)enums.nextElement(); if (entry.isDirectory()) {// 是目录 createDirectory(outputDir, entry.getName());// 创建空目录 } else {// 是文件 File tmpFile = new File(outputDir + "/" + entry.getName()); createDirectory(tmpFile.getParent() + "/", null);// 创建输出目录 InputStream in = null; OutputStream out = null; try { in = zipFile.getInputStream(entry);; out = new FileOutputStream(tmpFile); int length = 0; byte[] b = new byte[2048]; while ((length = in.read(b)) != -1) { out.write(b, 0, length); } } catch (IOException ex) { throw ex; } finally { if (in != null) in.close(); if (out != null) out.close(); } } } } catch (IOException e) { throw new IOException("解压缩文件出现异常", e); } finally { try { if (zipFile != null) { zipFile.close(); } } catch (IOException ex) { throw new IOException("关闭zipFile出现异常", ex); } } long endTime=System.currentTimeMillis(); System.out.println("解压时间: "+(startTime-endTime)+"ms"); } /** * 创建文件目录 * @param outputDir * @param subDir */ public static void createDirectory(String outputDir, String subDir) { File file = new File(outputDir); if (!(subDir == null || subDir.trim().equals(""))) {// 子目录不为空 file = new File(outputDir + "/" + subDir); } if (!file.exists()) { if (!file.getParentFile().exists()) file.getParentFile().mkdirs(); file.mkdirs(); } } /** * 获取Excel的值 第二行开始 * @param path * @param mapKeys 字段依次读取后保存到map的key,用于返回后来根据key获取相关数据 * @return * @throws IOException */ public static List<Map<String, Object>> getListExcel(String path,String[] mapKeys) throws IOException { List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>(); String excelName = getFileName(path);// 得到该文件夹下的excel名称;只取了第一个 path = path + excelName; InputStream is = new FileInputStream(path); // excelName.endsWith("xlsx"); try { //XSSFWorkbook workbook = new XSSFWorkbook(is); Workbook workbook = null; if(excelName.endsWith("xlsx")){ workbook = new XSSFWorkbook(is); }else{ workbook = new HSSFWorkbook(is); } Sheet sheet = workbook.getSheetAt(0); int rows = sheet.getLastRowNum();// 获取所有行数 //sheet.getL // String str[] = {"name","sex","cardno","address","img","work","economic"}; //定义返回的key String str[] = mapKeys; //定义返回的key // 循环EXCEL文件 获取每行的记录处理数据 从第2行开始,头行是注释 for (int i = 1; i <= rows; i++) { Row row = sheet.getRow(i);// 获取第i行 int coloumNum = sheet.getRow(i).getLastCellNum();// 获取第i行的列总数 Map<String, Object> map = new HashMap<String, Object>(); for (int j = 0; j < coloumNum; j++) { Cell data = row.getCell(j); if (data != null && !"".equals(data.toString()) ) { data.setCellType(Cell.CELL_TYPE_STRING); // sheet.getRow(0).getCell(j)获取该列的头部信息. map.put(str[j].trim(), data); } else { map.put(str[j].trim(), ""); } } listmap.add(map); } } catch (Exception e) { e.printStackTrace(); } finally { is.close(); } return listmap; } // 获取路径下的所有文件 public static String getFileName(String path) { File f = new File(path); if (!f.exists()) { return ""; } File fa[] = f.listFiles(); // for (int i = 0; i < fa.length; i++) { // System.out.println(fa[0].getName()); // } return fa[0].getName(); } public static void copyFile(File fromFile,File toFile) throws IOException{ FileInputStream ins = new FileInputStream(fromFile); FileOutputStream out = new FileOutputStream(toFile); byte[] b = new byte[1024]; int n=0; while((n=ins.read(b))!=-1){ out.write(b, 0, n); } ins.close(); out.close(); } /** * 获取图片类型Zip数据信息 * @param path * @return */ public static List<Map<String, Object>> traverseFolder2(String path) { List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>(); File file = new File(path); if (file.exists()) { File[] files = file.listFiles(); if (null == files || files.length == 0) { System.out.println("文件夹是空的!"); return listMap; } else { for (File file2 : files) { if (file2.isDirectory()) { System.out.println("文件夹:" + file2.getAbsolutePath()); //解决bug,如果是包含excel文件的,说明是模式1,并非 只有图片上传模式(模式2),详情看人员导入方法 TControlinfo.importZip(); if(file2.getAbsolutePath().indexOf("excel")>0){ listMap.clear(); return listMap; } listMap.addAll(traverseFolder2(file2.getAbsolutePath())); } else { Map<String, Object> dataMap = new HashMap<String,Object>(); System.out.println("文件:" + file2.getAbsolutePath()); String name = file2.getName(); if(name.indexOf("zip")>0)continue; // System.out.println("文件名:" + name); String control_name = ""; String control_cardno = ""; String contrl_address = ""; name = name.substring(0,name.indexOf(".")); String[] split = name.split("_"); if(split.length == 1){ control_name = split[0]; }else if(split.length == 2){ control_name = split[0]; control_cardno = split[1]; }else if(split.length == 3){ control_name = split[0]; control_cardno = split[1]; contrl_address = split[2]; } // dataMap.put("cardno", control_cardno); dataMap.put("name", control_name); dataMap.put("address", contrl_address); dataMap.put("img", file2.getAbsolutePath()); listMap.add(dataMap); } } } } else { System.out.println("文件不存在!"); } return listMap; }