Java解压上传zip或rar文件,并解压遍历文件中的html的路径详解编程语言

1.本文只提供了一个功能的代码

    public String addFreeMarker() throws  Exception  { 
        HttpSession session = request.getSession(); 
        User user =  (User) session.getAttribute(Constant.USER_SESSION_KEY); 
        String realName = user.getRealName(); 
        System.out.println("--------获取登录用户信息:------------"+realName); 
         /* 截取后缀名 */ 
        if (StringUtil.isEmpty(fileName)) { 
            throw new Exception("文件不能为空"); 
        } 
        int pos = fileName.lastIndexOf("."); 
        String str = fileName.substring(pos+1).toLowerCase(); 
        //判断上传文件必须是zip或者是rar否则不允许上传 
        if (StringUtil.isEmpty(str)||(!str.equals("zip")&&!str.equals("rar")&&!str.equals("png")&&!str.equals("jpg")&&!str.equals("gif"))) { 
            throw new Exception("上传文件格式错误,请重新上传"); 
        } 
        // 时间加后缀名保存 
        saveName = new Date().getTime() + "."+str; 
        //文件名 
        saveFileName = saveName.substring(0, saveName.lastIndexOf(".")); 
        // 根据服务器的文件保存地址和原文件名创建目录文件全路径 
        File imageFile = new File(ServletActionContext.getServletContext() 
                .getRealPath("upload") 
                + "/" +saveFileName+"/"+ saveName); 
       
       File descFile = new File(ServletActionContext.getServletContext().getRealPath("upload")+"/"+saveFileName); 
       if (!descFile.exists()) { 
           descFile.mkdirs(); 
           } 
       //解压目的文件 
       String descDir = ServletActionContext.getServletContext().getRealPath("upload")+"/"+saveFileName+"/"; 
        copy(myFile, imageFile); 
        //自己生成主键 
        Long seqNo = freemarkerService.getOrderNumberSeq(); 
        String orderNumber = RandomIdGenerator.generatorOrderNumber(seqNo); 
        HttpServletRequest httpRequest=(HttpServletRequest)request; 
        String httpURL = "http://" + request.getServerName() //服务器地址   
        + ":"    
        + request.getServerPort()           //端口号   
        + httpRequest.getContextPath();     //项目名称  
        String URL = httpURL+"/"+"upload"+"/"+saveFileName+"/"+saveName; 
        System.out.println("============访问地址是:============="+ URL); 
        //获取用户信息 
     
        freemarker.setFilesId(orderNumber); 
        freemarker.setAuthor(realName); 
        freemarker.setFilesName(saveFileName); 
        freemarker.setFilesUrl(URL); 
        //开始解压zip 
        if (str.equals("zip")) { 
            CompressFileUits.unZipFiles(imageFile, descDir); 
            //文件解压成功后,把数据插入到数据库 
            freemarkerService.save(freemarker); 
             
        }else if (str.equals("rar")) {  
        //开始解压rar 
            CompressFileUits.unRarFile(imageFile.getAbsolutePath(), descDir); 
            freemarkerService.save(freemarker); 
             
        } else if (str.equals("jpg") || str.equals("png") || str.equals("gif")) { 
            /** 
             * 增家java创建html功能,根据指定模板创建html 
             */ 
            freemarkerService.save(freemarker); 
            //上传的如果是图片的话,就生成html 
            String disrPath = ServletActionContext.getServletContext().getRealPath("template"); 
            String sourcedir = disrPath+"/template.html"; 
            //文件的http的路径 
            String IMAGEURL = httpURL+"/"+"template"+"/"+saveFileName+".html"; 
            //saveFileName 是文件的上传的文件名称 
            CreateHtmlUtils.MakeHtml(sourcedir, URL, disrPath, saveFileName); 
             
            freemarkerDetailService.insertFreeMarkerDetailFile(orderNumber,saveFileName+".html",IMAGEURL,new Date()); 
             
        } else { 
            throw new Exception("文件格式不正确不能解压"); 
        } 
        //遍历文件夹 
        getFileList(descDir,orderNumber); 
            return SUCCESS; 
        
    }

 

2.然后是文件解压的两个类

package com.tydic.eshop.util; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Enumeration; 
import org.apache.tools.zip.ZipEntry; 
import org.apache.tools.zip.ZipFile; 
import com.github.junrar.Archive; 
import com.github.junrar.rarfile.FileHeader; 
public class CompressFileUits { 
/**  
* 解压到指定目录  
* @param zipPath  
* @param descDir  
* @author*/   
public static void unZipFiles(String zipPath,String descDir)throws IOException{   
unZipFiles(new File(zipPath), descDir);   
}   
/**  
* 解压文件到指定目录  
* @param zipFile  
* @param descDir  
* @author isea533  
*/   
@SuppressWarnings("rawtypes")   
public static void unZipFiles(File zipFile,String descDir)throws IOException{   
File pathFile = new File(descDir);   
if(!pathFile.exists()){   
pathFile.mkdirs();   
}   
ZipFile zip = new ZipFile(zipFile);   
for(Enumeration entries = zip.getEntries();entries.hasMoreElements();){   
ZipEntry entry = (ZipEntry)entries.nextElement();   
String zipEntryName = entry.getName();   
InputStream in = zip.getInputStream(entry);   
String outPath = (descDir+zipEntryName).replaceAll("//*", "/");;   
//判断路径是否存在,不存在则创建文件路径   
File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));   
if(!file.exists()){   
file.mkdirs();   
}   
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压   
if(new File(outPath).isDirectory()){   
continue;   
}   
//输出文件路径信息   
            System.out.println(outPath);   
OutputStream out = new FileOutputStream(outPath);   
byte[] buf1 = new byte[1024];   
int len;   
while((len=in.read(buf1))>0){   
out.write(buf1,0,len);   
}   
in.close();   
out.close();   
}   
System.out.println("******************解压完毕********************");   
}   
/**  
* 根据原始rar路径,解压到指定文件夹下.       
* @param srcRarPath 原始rar路径  
* @param dstDirectoryPath 解压到的文件夹       
*/ 
public static void unRarFile(String srcRarPath, String dstDirectoryPath) { 
if (!srcRarPath.toLowerCase().endsWith(".rar")) { 
System.out.println("非rar文件!"); 
return; 
} 
File dstDiretory = new File(dstDirectoryPath); 
if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹 
             dstDiretory.mkdirs(); 
} 
Archive a = null; 
try { 
a = new Archive(new File(srcRarPath)); 
if (a != null) { 
a.getMainHeader().print(); // 打印文件信息. 
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()); 
//System.out.println(out.getAbsolutePath()); 
try {// 之所以这么写try,是因为万一这里面有了异常,不影响继续解压.  
if (!out.exists()) { 
if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录.  
                                     out.getParentFile().mkdirs(); 
} 
out.createNewFile(); 
} 
FileOutputStream os = new FileOutputStream(out); 
a.extractFile(fh, os); 
os.close(); 
} catch (Exception ex) { 
ex.printStackTrace(); 
} 
} 
fh = a.nextFileHeader(); 
} 
a.close(); 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
}

3.常见html的工具类,上篇文章有介绍 CreateHtmlUtils

package com.tydic.eshop.util; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.Calendar; 
/** 
* @ClassName: CreateHtmlUtils   
* @Description: Java 根据模板创建 html 
* @author  
* @date 2016年4月22日 下午3:51:16 
*/ 
public class CreateHtmlUtils { 
public static void main(String[] args) { 
String filePath = "E://hh_web_space//ecp//web//ecp_web_page//src//main//webapp//template//template.html"; 
String imagePath ="http://localhost:8080/ecp/upload/1461293787628/1461293787628.jpg"; 
String disrPath = "E://hh_web_space//ecp//web//ecp_web_page//src//main//webapp//template//"; 
String fileName = "liuren"; 
MakeHtml(filePath,imagePath,disrPath,fileName); 
} 
/** 
* @Title: MakeHtml  
* @Description: 创建html 
* @param    filePath 设定模板文件 
* @param    imagePath 需要显示图片的路径 
* @param    disrPath  生成html的存放路径 
* @param    fileName  生成html名字  
* @return void    返回类型  
* @throws 
*/ 
public static void MakeHtml(String filePath,String imagePath,String disrPath,String fileName ){ 
try { 
String title = "<image src="+'"'+imagePath+'"'+"/>"; 
System.out.print(filePath); 
String templateContent = ""; 
FileInputStream fileinputstream = new FileInputStream(filePath);// 读取模板文件 
int lenght = fileinputstream.available(); 
byte bytes[] = new byte[lenght]; 
fileinputstream.read(bytes); 
fileinputstream.close(); 
templateContent = new String(bytes); 
System.out.print(templateContent); 
templateContent = templateContent.replaceAll("###title###", title); 
System.out.print(templateContent); 
String fileame = fileName + ".html"; 
fileame = disrPath+"/" + fileame;// 生成的html文件保存路径。 
FileOutputStream fileoutputstream = new FileOutputStream(fileame);// 建立文件输出流 
System.out.print("文件输出路径:"); 
System.out.print(fileame); 
byte tag_bytes[] = templateContent.getBytes(); 
fileoutputstream.write(tag_bytes); 
fileoutputstream.close(); 
} catch (Exception e) { 
System.out.print(e.toString()); 
} 
} 
}

4.复制的方法 copy

  // 复制方法 
public static void copy(File src, File dst) { 
try { 
InputStream in = null; 
OutputStream out = null; 
try { 
in = new BufferedInputStream(new FileInputStream(src), 
BUFFER_SIZE); 
out = new BufferedOutputStream(new FileOutputStream(dst), 
BUFFER_SIZE); 
byte[] buffer = new byte[BUFFER_SIZE]; 
while (in.read(buffer) > 0) { 
out.write(buffer); 
} 
} finally { 
if (null != in) { 
in.close(); 
} 
if (null != out) { 
out.close(); 
} 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 
}    

5.便利解压的的zip或者是rar文件夹

/** 
* @throws ServiceException  
* @Title: getFileList  
* @Description: 递归遍历指定文件夹下的文件 
* @param @param strPath 
* @param @return    设定文件  
* @return List<File>    返回类型  
* @throws 
*/ 
public  List<File> getFileList(String strPath,String fileordernumber) throws ServiceException { 
File dir = new File(strPath); 
File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组 
List<File> fileList = new ArrayList<File>(); 
if (files != null) { 
for (int i = 0; i < files.length; i++) { 
String fileName = files[i].getName(); 
if (files[i].isDirectory()) { // 判断是文件还是文件夹 
getFileList(files[i].getAbsolutePath(),fileordernumber); // 获取文件绝对路径 
System.out.println("输出文件的绝对路径"+files[i].getAbsolutePath()); 
} else if (fileName.endsWith("html")) { // 判断文件名是否以.avi结尾 
String strFileName = files[i].getAbsolutePath(); 
System.out.println("------------" + strFileName+"+++++"+fileName); 
//                    uploadcompressDetailService.insertCompressDetailFile(fileordernumber,fileName,strFileName,new Date()); 
freemarkerDetailService.insertFreeMarkerDetailFile(fileordernumber,fileName,strFileName,new Date()); 
fileList.add(files[i]); 
} else { 
continue; 
} 
} 
} 
return fileList; 
}

 6.其中需要的架包

        <!-- 导入zip解压包 --> 
<dependency> 
<groupId>ant</groupId> 
<artifactId>ant</artifactId> 
<version>1.6.5</version> 
</dependency> 
<!-- 导入rar解压包 --> 
<dependency> 
<groupId>com.github.junrar</groupId> 
<artifactId>junrar</artifactId> 
<version>0.7</version> 
</dependency>            

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/16611.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论