项目使用当中遇到的吭
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 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 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 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 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 unZipFiles(File zipFile, String descDir) throws IOException {
Map 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 unRarFile(String srcRarPath, String dstDirectoryPath) throws Exception {
Map 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;
}
}