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>            
原文地址:https://www.cnblogs.com/lr393993507/p/5434425.html