1.解压缩接口
public interface Decompress {
//curFilePreDir,压缩包中的压缩包如果跟外层文件夹,文件重名,会出现问题,加上上一层的目录前缀,可以避免
public<MulpartFile> decompress(File file, String curFilePredir);
}
2.解压缩类实现Decompress接口
public class Unzip implements Decompress {
@Override
public List<MultipartFile> decompress(File file, String curFilePredir){
List<MultipartFile> res = unZip(file,curFilePredir);
return res;
}
}
public class UnTar implements Decompress {
@Override
public List<MultipartFile> decompress(File file, String curFilePredir){
List<MultipartFile> res = unTar(file,curFilePredir);
return res;
}
}
public class UnRar implements Decompress {
@Override
public List<MultipartFile> decompress(File file, String curFilePredir){
List<MultipartFile> res = unRar(file,curFilePredir);
return res;
}
}
public class Un7z implements Decompress {
@Override
public List<MultipartFile> decompress(File file, String curFilePredir){
List<MultipartFile> res = un7z(file,curFilePredir);
return res;
}
}
public class GetImagesFromTif implements Decompress {
@Override
public List<MultipartFile> decompress(File file, String curFilePredir){
List<MultipartFile> res = tifToJpg(file);
return res;
}
}
public class GetImagesFromPdf implements Decompress {
@Override
public List<MultipartFile> decompress(File file, String curFilePredir){
List<MultipartFile> res = PdfUtil.pdf2png(file);
return res;
}
}
3.工厂类,根据传入的文件后缀,选择对应的压缩方法
public class DecompressFactory{
public static Decompress getFiles(String fileSuffix){
switch(fileSuffix){
case "zip":
return new Unzip();
case "rar":
return new UnRar();
case "7z":
return new Un7z();
case "tar":
return new UnTar();
case "pdf":
return new GetImagesFromPdf();
case "tif":
return new GetImagesFromTif();
default:
return null;
}
}
}
4.FileUtil工具类写解压缩方法
public class FileUtil{
public static List<MultipartFile> unZip(File file, String curFilePredir){
List<MultipartFile> res = new ArrayList<>();
File curFile =null;
List<File> temp = new ArrayList<>();
try{
@Cleanup ZipFile zipFile = new ZipFile(file,Charset.forName("GBK"));
@Cleanup InputStream inputStream = null;
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while(entries.hasMoreElements){
ZipEntry zipEntry = entries.nextElement();
String curFileName = zipEntry.getName();
curFileName = curFilePreDir + curFileName;
curFile = new File(curFileName);
if(zipEntry.isDirectory()){
curFile.mkdir();
temp.add(curFile);
continue;
}
String curFileSuffix = getFileSuffix(curFileName);
inputStream = zipFile.getInputStream(zipEntry);
outPutToFile(inputStream,curFile);
if(isCompress(curFileSuffix)){
int index = curFileName.lastIndexOf("/");
String tempCurFilePreDir = "";
if(index != -1){
tempCurFilePreDir = curFileName.substring(0,index+1);
}
Decompress decompress = DecompressFactory.getFiles(curFileSuffix);
List<MultipartFile> list = decompress.decompress(curFile,tempCurFilePreDir);
res.addAll(list);
}else{
MultipartFile multipartFile = fileToMultipartFile(curFile,curFileName);
res.add(multipartFile);
}
curFile.deleteOnExit();
curFile.delete();
}
}catch(Exception e){
throw new RuntimeException(e);
}finally{
deleteFile(temp.get(0));
}
return res;
}
public static List<MultipartFile> unRar(File file, String curFilePredir){
List<MultipartFile> res = new ArrayList<>();
FileHeader fileHeader = null;
File curFile =null;
List<File> temp = new ArrayList<>();
try{
@Cleanup FileInputStream fileInputStream = new FileInputStream(file);
@Cleanup Archive archive = new Archive(fileInputStream);
List<FileHeader> fileHeaders = archive.getFileHeaders();
for(int i = fileHeaders.size() - 1; i>=0 ;i--){
fileHeader = fileHeaders.get(i);
String curFileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() : fileHeader.getFileNameW();
curFileName = curFilePreDir + curFileName;
curFile = new File(curFileName);
if(fileHeader.isDirectory()){
curFile.mkdir();
temp.add(curFile);
continue;
}
@Cleanup FileOutPutStream fileOutputStream = new FileOutputStream(curFile);
archive.extractFile(fileHeader,fileOutputStream);
String curFileSuffix = getFileSuffix(curFileName);
if(isCompress(curFileSuffix)){
int index = curFileName.lastIndexOf("\\");
String tempCurFilePreDir = "";
if(index != -1){
tempCurFilePreDir = curFileName.substring(0,index+1);
}
Decompress decompress = DecompressFactory.getFiles(curFileSuffix);
List<MultipartFile> list = decompress.decompress(curFile,tempCurFilePreDir);
res.addAll(list);
}else{
MultipartFile multipartFile = fileToMultipartFile(curFile,curFileName);
res.add(multipartFile);
}
curFile.deleteOnExit();
curFile.delete();
}
}catch(Exception e){
throw new RuntimeException(e);
}finally{
deleteFile(temp.get(0));
}
return res;
}
public static List<MultipartFile> un7z(File file, String curFilePredir){
List<MultipartFile> res = new ArrayList<>();
File curFile =null;
List<File> temp = new ArrayList<>();
try{
@Cleanup SenvenZFile sevenZFile = new SevenZFile(file);
SevenZArchiveEntry nextEntry = null;
while((nextEntry = sevenZFile.getNextEntry()) != null){
String curFileName = nextEntry.getName();
curFileName = curFilePreDir + curFileName;
curFile = new File(curFileName);
if(nextEntry.isDirectory()){
curFile.mkdir();
temp.add(curFile);
continue;
}
fileOutput(curFile,sevenZFile,nextEntry);
String curFileSuffix = getFileSuffix(curFileName);
inputStream = zipFile.getInputStream(zipEntry);
outPutToFile(inputStream,curFile);
if(isCompress(curFileSuffix)){
int index = curFileName.lastIndexOf("/");
String tempCurFilePreDir = "";
if(index != -1){
tempCurFilePreDir = curFileName.substring(0,index+1);
}
Decompress decompress = DecompressFactory.getFiles(curFileSuffix);
List<MultipartFile> list = decompress.decompress(curFile,tempCurFilePreDir);
res.addAll(list);
}else{
MultipartFile multipartFile = fileToMultipartFile(curFile,curFileName);
res.add(multipartFile);
}
curFile.deleteOnExit();
curFile.delete();
}
}catch(Exception e){
throw new RuntimeException(e);
}finally{
deleteFile(temp.get(0));
}
return res;
}
public static List<MultipartFile> unTar(File file, String curFilePredir){
List<MultipartFile> res = new ArrayList<>();
File curFile =null;
List<File> temp = new ArrayList<>();
try{
@Cleanup FileInputStream fileInputStream = new FileInputStream(file);
@Cleanup TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(fileInputStream);
ArchiveEntry nextEntry = null;
while((nextEntry = tarArchiveInputStream.getEntry()) != null){
String curFileName = nextEntry.getName();
curFileName = curFilePreDir + curFileName;
curFile = new File(curFileName);
if(nextEntry.isDirectory()){
curFile.mkdir();
temp.add(curFile);
continue;
}
tarEntryOutputToFile(curFile,tarArchiveInputStream,nextEntry);
String curFileSuffix = getFileSuffix(curFileName);
inputStream = zipFile.getInputStream(zipEntry);
outPutToFile(inputStream,curFile);
if(isCompress(curFileSuffix)){
int index = curFileName.lastIndexOf("/");
String tempCurFilePreDir = "";
if(index != -1){
tempCurFilePreDir = curFileName.substring(0,index+1);
}
Decompress decompress = DecompressFactory.getFiles(curFileSuffix);
List<MultipartFile> list = decompress.decompress(curFile,tempCurFilePreDir);
res.addAll(list);
}else{
MultipartFile multipartFile = fileToMultipartFile(curFile,curFileName);
res.add(multipartFile);
}
curFile.deleteOnExit();
curFile.delete();
}
}catch(Exception e){
throw new RuntimeException(e);
}finally{
deleteFile(temp.get(0));
}
return res;
}
public static String getFileSuffix(String fileName){
String fileType = null;
if(fileName != null){
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
if(fileName.lastIndexOf(".") > -1){
fileType = (fileName.substring(fileName.lastIndexOf(".")+1)).toLowerCase(Locale.CHINA);
}
}
return fileType;
}
public static boolean isCompress(String curFileSuffix){
if("zip".equals(curFileSuffix) || "rar".equals(curFileSuffix) || "tar".equals(curFileSuffix) || "7z".equals(curFileSuffix) || "pdf".equals(curFileSuffix) || "tif".equals(curFileSuffix)){
return true;
}else{
return false;
}
}
public static void deleteFile(File file){
File[] files = file.listFiles();
for(File f:files){
if(f.siDirectory()){
deleteFile(f);
}else{
f.delete();
}
}
file.delete();
}
public static MultipartFile fileToMultipartFile(File file, String fileName){
MultipartFile mutipartFile = null;
try{
@Cleanup InputStream inputStream = new FileInputStream(file);
FileItem fileItem = new DiskFileItem(fileName,Files.probeContentType(file.toPath()),false,file.getName(),(int)file.length(),file.getParentFile());
@Cleanup OutputStream outputStram = fileItem.getOutPutStream();
IOUtils.copy(inputStream,outputStream);
multipartFile = new CommonsMultipartFile(fileItem);
return multipartFile;
}catch(IOException e){
throw new RuntimeException(e);
}
}
public static void outPutToFile(InputStream inputStream,File file){
try{
@Cleanup FileOutputStream fileOutputStream = new FileOutputStream(file);
@Cleanup BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int n;
byte[] bytes = new byte[8192];
while((n = inputStream.read(bytes)) != -1){
bufferedOutputStream.write(bytes,0,n);
}
}catch(Exception e){
throw new RunException(e);
}
}
public static void fileOutput(File file, SevenZFile sevenZFile, SevenZArchiveEntry entry){
try{
@Cleanup FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] content = new byte[(int)entry.getSize()];
sevenZFile.read(content,0,content.lenth);
fileOutputStream.write(content);
}catch(Exception e){
e.printStackTrace();
}
}
public static void tarEntryOutputToFile(File file,TarArchiveInputStream inputStream,ArchiveEntry entry){
try{
@Cleanup FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] content = new byte[(int)entry.getSize()];
inputStream.read(content,0,content.lenth);
fileOutputStream.write(content);
}catch(Exception e){
e.printStackTrace();
}
}
}