項目使用當中遇到的吭
1:rar格式壓縮包僅支持WINRAR5以下的,如果是WINRAR5+ 那么FileHeaders獲取的size就為0;
2:因為用的是springboot所以本地文件夾獲取不到路徑,因為最終要打成jar包運行在服務器的(獲取項目路徑本地是可以的,但是在linux上會出現找不到路徑)
3:文件夾傳統方式的也是無法刪除(技術有限)
package com.isky.dataservice.utils; import java.io.File; import java.util.HashSet; import java.util.Map; import java.util.Set; import com.isky.common.utils.StringUtil; import com.isky.dataservice.utils.enums.CommonEnum; import org.springframework.web.multipart.MultipartFile; /** * 解壓文件包(zip和rar格式) * @param file */ public class UploadUtil { public static String path = "/home/asserts"; /** * 解析上傳的壓縮文件 * * @param file 上傳文件 * @return * @throws Exception */ public static Set<Integer> resolveCompressUploadFile(MultipartFile file) throws Exception { String[] pics = {"jpg", "jpeg", "png", "psd", "gif", "bmp", "tiff", "cdr", "svg"}; String[] files = {"pdf", "txt", "text", "xlsx", "xls", "docx", "doc", "json", "xml", "csv", "rar", "zip"}; String[] videos = {"ape", "ra", "wma", "mp3", "mp4", "wmv", "vob", "mkv", "mpe", "mpeg", "mpg", "divx", "avi", "rmvb", "rm", "asf", "mov", "flv", "3gp"}; Map<String, String> map = null; if (file.isEmpty()) { throw new Exception(CommonEnum.FILE_NOT_NULL.getName()); } String fileName = file.getOriginalFilename(); int pos = fileName.lastIndexOf("."); //獲取后綴名 String extName = fileName.substring(pos + 1).toLowerCase(); HashSet<Integer> set = new HashSet<>(); if (extName.equals("zip") || extName.equals("rar")) { String saveName = StringUtil.getUUID() + "." + extName; String saveFileName = saveName.substring(0, saveName.lastIndexOf(".")); // 根據服務器的文件保存地址和原文件名創建目錄文件全路徑 File pushFile = new File(path + "/" + saveFileName + "/" + saveName); File descFile = new File(path + "/" + saveFileName); if (!descFile.exists()) { descFile.mkdirs(); } //解壓目的文件 String descDir = path + "/" + saveFileName + "/"; file.transferTo(pushFile); if (extName.equals("zip")) { map = CompressFileUtils.unZipFiles(pushFile, descDir); } else { map = CompressFileUtils.unRarFile(pushFile.getAbsolutePath(), descDir); } Set<String> strings = map.keySet(); outer: for (String str : strings) { for (int i = 0; i < pics.length; i++) { if (str.equalsIgnoreCase(pics[i])) { set.add(3); continue outer; } } for (int i = 0; i < videos.length; i++) { if (str.equalsIgnoreCase(videos[i])) { set.add(5); continue outer; } } for (int i = 0; i < files.length; i++) { if (str.equalsIgnoreCase(files[i])) { set.add(4); continue outer; } } set.add(99); } if (descFile.exists()) { deleteAllFilesOfDir(descFile); descFile.delete(); } return set; } for (String str : pics) { if (extName.equalsIgnoreCase(str)) { set.add(3); return set; } } for (String str : videos) { if (extName.equalsIgnoreCase(str)) { set.add(5); return set; } } for (String str : files) { if (extName.equalsIgnoreCase(str)) { set.add(4); return set; } } set.add(99); return set; } public static void deleteAllFilesOfDir(File path) { if (null != path) { if (!path.exists()) { return; } if (path.isFile()) { boolean result = path.delete(); int count = 0; while (!result && count++ < 10) { System.gc(); result = path.delete(); } } File[] files = path.listFiles(); if (null != files) { for (File f : files) { deleteAllFilesOfDir(f); } } path.delete(); } } }
package com.isky.dataservice.utils; import java.io.*; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import com.github.junrar.Archive; import com.github.junrar.rarfile.FileHeader; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; /** * @author Administrator */ public class CompressFileUtils { /** * 解壓文件到指定目錄 * * @param zipFile * @param descDir */ @SuppressWarnings("rawtypes") public static Map<String, String> unZipFiles(File zipFile, String descDir) throws IOException { Map<String, String> map = new HashMap<>(); File pathFile = new File(descDir); if (!pathFile.exists()) { pathFile.mkdirs(); } ZipFile zip = new ZipFile(zipFile, "gbk"); for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) { ZipEntry entry = (ZipEntry) entries.nextElement(); String zipEntryName = entry.getName(); //判斷文件全路徑是否為文件夾,如果是上面已經上傳,不需要解壓 if (entry.isDirectory()) { continue; } int i = zipEntryName.lastIndexOf("."); String sbu = zipEntryName.substring(i + 1); map.put(sbu, "1"); } return map; } /** * 根據原始rar路徑,解壓到指定文件夾下. * * @param srcRarPath 原始rar路徑 * @param dstDirectoryPath 解壓到的文件夾 */ public static Map<String, String> unRarFile(String srcRarPath, String dstDirectoryPath) throws Exception { Map<String, String> map = new HashMap<>(); FileOutputStream os = null; File dstDiretory = new File(dstDirectoryPath); if (!dstDiretory.exists()) { dstDiretory.mkdirs(); } Archive a = null; a = new Archive(new File(srcRarPath)); if (a != null) { FileHeader fh = a.nextFileHeader(); while (fh != null) { if (fh.isDirectory()) { File fol = new File(dstDirectoryPath + File.separator + fh.getFileNameString()); fol.mkdirs(); } else { File out = new File(dstDirectoryPath + File.separator + fh.getFileNameString().trim()); String fileName = fh.getFileNameString().trim(); String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); map.put(fileType, "1"); if (!out.exists()) { if (!out.getParentFile().exists()) { out.getParentFile().mkdirs(); } out.createNewFile(); } os = new FileOutputStream(out); a.extractFile(fh, os); } fh = a.nextFileHeader(); } } if(os != null){ os.close(); } if(a != null){ a.close(); } return map; } }