• 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>            
  • 相关阅读:
    Vue3 从入门到入土(TypeScript入门)
    go select 原理解析
    Golang 内存分配
    Vue3 从入门到入土(TypeScript数据类型)
    Vue3 从入门到入土(TypeScript接口)
    总结一下 linux 中的线程模型
    Golang Channel 实现原理
    身份证号码缩小方案
    sync.waitGroup 原理分析
    go 语言的 slice 注意点
  • 原文地址:https://www.cnblogs.com/lr393993507/p/5434425.html
Copyright © 2020-2023  润新知