• 文件上传工具类源码


      有一个好的工具,会让你的开发事半功倍。上传,可以说是下载的逆过程。

      1 import java.io.File;
      2 import java.io.IOException;
      3 import java.text.SimpleDateFormat;
      4 import java.util.ArrayList;
      5 import java.util.Arrays;
      6 import java.util.Date;
      7 import java.util.HashMap;
      8 import java.util.Iterator;
      9 import java.util.List;
     10 import java.util.Map;
     11 import java.util.Random;
     12 
     13 import javax.servlet.http.HttpServletRequest;
     14 
     15 import org.apache.commons.fileupload.FileItem;
     16 import org.apache.commons.fileupload.FileUploadException;
     17 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
     18 import org.apache.commons.fileupload.servlet.ServletFileUpload;
     19 
     20 /**
     21  * 文件上传工具类
     22  * 
     23  */
     24 public class UploadUtils {
     25     /**
     26      * 表单字段常量
     27      */
     28     public static final String FORM_FIELDS = "form_fields";
     29     /**
     30      * 文件域常量
     31      */
     32     public static final String FILE_FIELDS = "file_fields";
     33 
     34     // 最大文件大小
     35     private long maxSize = 1000000;
     36     // 定义允许上传的文件扩展名
     37     private Map<String, String> extMap = new HashMap<String, String>();
     38     // 文件保存目录相对路径
     39     private String basePath = "upload";
     40     // 文件的目录名
     41     private String dirName = "images";
     42     // 上传临时路径
     43     private static final String TEMP_PATH = "/temp";
     44     private String tempPath = basePath + TEMP_PATH;
     45     // 若不指定则文件名默认为 yyyyMMddHHmmss_xyz
     46     private String fileName;
     47 
     48     // 文件保存目录路径
     49     private String savePath;
     50     // 文件保存目录url
     51     private String saveUrl;
     52     // 文件最终的url包括文件名
     53     private String fileUrl;
     54 
     55     public UploadUtils() {
     56         // 其中images,flashs,medias,files,对应文件夹名称,对应dirName
     57         // key文件夹名称
     58         // value该文件夹内可以上传文件的后缀名
     59         extMap.put("images", "gif,jpg,jpeg,png,bmp");
     60         extMap.put("flashs", "swf,flv");
     61         extMap.put("medias", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
     62         extMap.put("files", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
     63     }
     64 
     65     /**
     66      * 文件上传
     67      * 
     68      * @param request
     69      * @return infos info[0] 验证文件域返回错误信息 info[1] 上传文件错误信息 info[2] savePath info[3] saveUrl info[4] fileUrl
     70      */
     71     @SuppressWarnings("unchecked")
     72     public String[] uploadFile(HttpServletRequest request) {
     73         String[] infos = new String[5];
     74         // 验证
     75         infos[0] = this.validateFields(request);
     76         // 初始化表单元素
     77         Map<String, Object> fieldsMap = new HashMap<String, Object>();
     78         if (infos[0].equals("true")) {
     79             fieldsMap = this.initFields(request);
     80         }
     81         // 上传
     82         List<FileItem> fiList = (List<FileItem>) fieldsMap.get(UploadUtils.FILE_FIELDS);
     83         if (fiList != null) {
     84             for (FileItem item : fiList) {
     85                 infos[1] = this.saveFile(item);
     86             }
     87             infos[2] = savePath;
     88             infos[3] = saveUrl;
     89             infos[4] = fileUrl;
     90         }
     91         return infos;
     92     }
     93 
     94     /**
     95      * 上传验证,并初始化文件目录
     96      * 
     97      * @param request
     98      */
     99     private String validateFields(HttpServletRequest request) {
    100         String errorInfo = "true";
    101         // boolean errorFlag = true;
    102         // 获取内容类型
    103         String contentType = request.getContentType();
    104         int contentLength = request.getContentLength();
    105         // 文件保存目录路径
    106         savePath = request.getSession().getServletContext().getRealPath("/") + basePath + "/";
    107         // 文件保存目录URL
    108         saveUrl = request.getContextPath() + "/" + basePath + "/";
    109         File uploadDir = new File(savePath);
    110         if (contentType == null || !contentType.startsWith("multipart")) {
    111             // TODO
    112             System.out.println("请求不包含multipart/form-data流");
    113             errorInfo = "请求不包含multipart/form-data流";
    114         } else if (maxSize < contentLength) {
    115             // TODO
    116             System.out.println("上传文件大小超出文件最大大小");
    117             errorInfo = "上传文件大小超出文件最大大小[" + maxSize + "]";
    118         } else if (!ServletFileUpload.isMultipartContent(request)) {
    119             // TODO
    120             errorInfo = "请选择文件";
    121         } else if (!uploadDir.isDirectory()) {// 检查目录
    122             // TODO
    123             errorInfo = "上传目录[" + savePath + "]不存在";
    124         } else if (!uploadDir.canWrite()) {
    125             // TODO
    126             errorInfo = "上传目录[" + savePath + "]没有写权限";
    127         } else if (!extMap.containsKey(dirName)) {
    128             // TODO
    129             errorInfo = "目录名不正确";
    130         } else {
    131             // .../basePath/dirName/
    132             // 创建文件夹
    133             savePath += dirName + "/";
    134             saveUrl += dirName + "/";
    135             File saveDirFile = new File(savePath);
    136             if (!saveDirFile.exists()) {
    137                 saveDirFile.mkdirs();
    138             }
    139             // .../basePath/dirName/yyyyMMdd/
    140             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    141             String ymd = sdf.format(new Date());
    142             savePath += ymd + "/";
    143             saveUrl += ymd + "/";
    144             File dirFile = new File(savePath);
    145             if (!dirFile.exists()) {
    146                 dirFile.mkdirs();
    147             }
    148 
    149             // 获取上传临时路径
    150             tempPath = request.getSession().getServletContext().getRealPath("/") + tempPath + "/";
    151             File file = new File(tempPath);
    152             if (!file.exists()) {
    153                 file.mkdirs();
    154             }
    155         }
    156 
    157         return errorInfo;
    158     }
    159 
    160     /**
    161      * 处理上传内容
    162      * 
    163      * @param request
    164      * @param maxSize
    165      * @return
    166      */
    167 //    @SuppressWarnings("unchecked")
    168     private Map<String, Object> initFields(HttpServletRequest request) {
    169 
    170         // 存储表单字段和非表单字段
    171         Map<String, Object> map = new HashMap<String, Object>();
    172 
    173         // 第一步:判断request
    174         boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    175         // 第二步:解析request
    176         if (isMultipart) {
    177             // Create a factory for disk-based file items
    178             DiskFileItemFactory factory = new DiskFileItemFactory();
    179 
    180             // 阀值,超过这个值才会写到临时目录,否则在内存中
    181             factory.setSizeThreshold(1024 * 1024 * 10);
    182             factory.setRepository(new File(tempPath));
    183 
    184             // Create a new file upload handler
    185             ServletFileUpload upload = new ServletFileUpload(factory);
    186 
    187             upload.setHeaderEncoding("UTF-8");
    188 
    189             // 最大上传限制
    190             upload.setSizeMax(maxSize);
    191 
    192             /* FileItem */
    193             List<FileItem> items = null;
    194             // Parse the request
    195             try {
    196                 items = upload.parseRequest(request);
    197             } catch (FileUploadException e) {
    198                 // TODO Auto-generated catch block
    199                 e.printStackTrace();
    200             }
    201 
    202             // 第3步:处理uploaded items
    203             if (items != null && items.size() > 0) {
    204                 Iterator<FileItem> iter = items.iterator();
    205                 // 文件域对象
    206                 List<FileItem> list = new ArrayList<FileItem>();
    207                 // 表单字段
    208                 Map<String, String> fields = new HashMap<String, String>();
    209                 while (iter.hasNext()) {
    210                     FileItem item = iter.next();
    211                     // 处理所有表单元素和文件域表单元素
    212                     if (item.isFormField()) { // 表单元素
    213                         String name = item.getFieldName();
    214                         String value = item.getString();
    215                         fields.put(name, value);
    216                     } else { // 文件域表单元素
    217                         list.add(item);
    218                     }
    219                 }
    220                 map.put(FORM_FIELDS, fields);
    221                 map.put(FILE_FIELDS, list);
    222             }
    223         }
    224         return map;
    225     }
    226 
    227     /**
    228      * 保存文件
    229      * 
    230      * @param obj
    231      *            要上传的文件域
    232      * @param file
    233      * @return
    234      */
    235     private String saveFile(FileItem item) {
    236         String error = "true";
    237         String fileName = item.getName();
    238         String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
    239 
    240         if (item.getSize() > maxSize) { // 检查文件大小
    241             // TODO
    242             error = "上传文件大小超过限制";
    243         } else if (!Arrays.<String> asList(extMap.get(dirName).split(",")).contains(fileExt)) {// 检查扩展名
    244             error = "上传文件扩展名是不允许的扩展名。
    只允许" + extMap.get(dirName) + "格式。";
    245         } else {
    246             String newFileName;
    247             if ("".equals(fileName.trim())) {
    248                 SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
    249                 newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
    250             } else {
    251                 newFileName = fileName + "." + fileExt;
    252             }
    253             // .../basePath/dirName/yyyyMMdd/yyyyMMddHHmmss_xxx.xxx
    254             fileUrl = saveUrl + newFileName;
    255             try {
    256                 File uploadedFile = new File(savePath, newFileName);
    257 
    258                 item.write(uploadedFile);
    259 
    260                 /*
    261                  * FileOutputStream fos = new FileOutputStream(uploadFile); // 文件全在内存中 if (item.isInMemory()) { fos.write(item.get()); } else { InputStream is = item.getInputStream(); byte[] buffer =
    262                  * new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { fos.write(buffer, 0, len); } is.close(); } fos.close(); item.delete();
    263                  */
    264             } catch (IOException e) {
    265                 e.printStackTrace();
    266                 System.out.println("上传失败了!!!");
    267             } catch (Exception e) {
    268                 e.printStackTrace();
    269             }
    270         }
    271         return error;
    272     }
    273 
    274     /** **********************get/set方法********************************* */
    275 
    276     public String getSavePath() {
    277         return savePath;
    278     }
    279 
    280     public String getSaveUrl() {
    281         return saveUrl;
    282     }
    283 
    284     public long getMaxSize() {
    285         return maxSize;
    286     }
    287 
    288     public void setMaxSize(long maxSize) {
    289         this.maxSize = maxSize;
    290     }
    291 
    292     public Map<String, String> getExtMap() {
    293         return extMap;
    294     }
    295 
    296     public void setExtMap(Map<String, String> extMap) {
    297         this.extMap = extMap;
    298     }
    299 
    300     public String getBasePath() {
    301         return basePath;
    302     }
    303 
    304     public void setBasePath(String basePath) {
    305         this.basePath = basePath;
    306         tempPath = basePath + TEMP_PATH;
    307     }
    308 
    309     public String getDirName() {
    310         return dirName;
    311     }
    312 
    313     public void setDirName(String dirName) {
    314         this.dirName = dirName;
    315     }
    316 
    317     public String getTempPath() {
    318         return tempPath;
    319     }
    320 
    321     public void setTempPath(String tempPath) {
    322         this.tempPath = tempPath;
    323     }
    324 
    325     public String getFileUrl() {
    326         return fileUrl;
    327     }
    328 
    329     public String getFileName() {
    330         return fileName;
    331     }
    332 
    333     public void setFileName(String fileName) {
    334         this.fileName = fileName;
    335     }
    336 
    337 }

      既然你要上传,那对文件的操作就不可避免了。

      1 import java.io.File;
      2 import java.io.FileInputStream;
      3 import java.io.FileOutputStream;
      4 import java.io.IOException;
      5 import java.io.InputStream;
      6 import java.io.OutputStream;
      7 import java.util.Enumeration;
      8 
      9 import org.apache.tools.zip.ZipEntry;
     10 import org.apache.tools.zip.ZipFile;
     11 import org.apache.tools.zip.ZipOutputStream;
     12 import org.slf4j.Logger;
     13 import org.slf4j.LoggerFactory;
     14 
     15 /**
     16  * 文件操作工具类
     17  * 实现文件的创建、删除、复制、压缩、解压以及目录的创建、删除、复制、压缩解压等功能
     18  */
     19 public class FileUtils extends org.apache.commons.io.FileUtils {
     20     
     21     private static Logger log = LoggerFactory.getLogger(FileUtils.class);
     22 
     23     /**
     24      * 复制单个文件,如果目标文件存在,则不覆盖
     25      * @param srcFileName 待复制的文件名
     26      * @param descFileName 目标文件名
     27      * @return 如果复制成功,则返回true,否则返回false
     28      */
     29     public static boolean copyFile(String srcFileName, String descFileName) {
     30         return FileUtils.copyFileCover(srcFileName, descFileName, false);
     31     }
     32 
     33     /**
     34      * 复制单个文件
     35      * @param srcFileName 待复制的文件名
     36      * @param descFileName 目标文件名
     37      * @param coverlay 如果目标文件已存在,是否覆盖
     38      * @return 如果复制成功,则返回true,否则返回false
     39      */
     40     public static boolean copyFileCover(String srcFileName,
     41             String descFileName, boolean coverlay) {
     42         File srcFile = new File(srcFileName);
     43         // 判断源文件是否存在
     44         if (!srcFile.exists()) {
     45             log.debug("复制文件失败,源文件 " + srcFileName + " 不存在!");
     46             return false;
     47         }
     48         // 判断源文件是否是合法的文件
     49         else if (!srcFile.isFile()) {
     50             log.debug("复制文件失败," + srcFileName + " 不是一个文件!");
     51             return false;
     52         }
     53         File descFile = new File(descFileName);
     54         // 判断目标文件是否存在
     55         if (descFile.exists()) {
     56             // 如果目标文件存在,并且允许覆盖
     57             if (coverlay) {
     58                 log.debug("目标文件已存在,准备删除!");
     59                 if (!FileUtils.delFile(descFileName)) {
     60                     log.debug("删除目标文件 " + descFileName + " 失败!");
     61                     return false;
     62                 }
     63             } else {
     64                 log.debug("复制文件失败,目标文件 " + descFileName + " 已存在!");
     65                 return false;
     66             }
     67         } else {
     68             if (!descFile.getParentFile().exists()) {
     69                 // 如果目标文件所在的目录不存在,则创建目录
     70                 log.debug("目标文件所在的目录不存在,创建目录!");
     71                 // 创建目标文件所在的目录
     72                 if (!descFile.getParentFile().mkdirs()) {
     73                     log.debug("创建目标文件所在的目录失败!");
     74                     return false;
     75                 }
     76             }
     77         }
     78 
     79         // 准备复制文件
     80         // 读取的位数
     81         int readByte = 0;
     82         InputStream ins = null;
     83         OutputStream outs = null;
     84         try {
     85             // 打开源文件
     86             ins = new FileInputStream(srcFile);
     87             // 打开目标文件的输出流
     88             outs = new FileOutputStream(descFile);
     89             byte[] buf = new byte[1024];
     90             // 一次读取1024个字节,当readByte为-1时表示文件已经读取完毕
     91             while ((readByte = ins.read(buf)) != -1) {
     92                 // 将读取的字节流写入到输出流
     93                 outs.write(buf, 0, readByte);
     94             }
     95             log.debug("复制单个文件 " + srcFileName + " 到" + descFileName
     96                     + "成功!");
     97             return true;
     98         } catch (Exception e) {
     99             log.debug("复制文件失败:" + e.getMessage());
    100             return false;
    101         } finally {
    102             // 关闭输入输出流,首先关闭输出流,然后再关闭输入流
    103             if (outs != null) {
    104                 try {
    105                     outs.close();
    106                 } catch (IOException oute) {
    107                     oute.printStackTrace();
    108                 }
    109             }
    110             if (ins != null) {
    111                 try {
    112                     ins.close();
    113                 } catch (IOException ine) {
    114                     ine.printStackTrace();
    115                 }
    116             }
    117         }
    118     }
    119 
    120     /**
    121      * 复制整个目录的内容,如果目标目录存在,则不覆盖
    122      * @param srcDirName 源目录名
    123      * @param descDirName 目标目录名
    124      * @return 如果复制成功返回true,否则返回false
    125      */
    126     public static boolean copyDirectory(String srcDirName, String descDirName) {
    127         return FileUtils.copyDirectoryCover(srcDirName, descDirName,
    128                 false);
    129     }
    130 
    131     /**
    132      * 复制整个目录的内容 
    133      * @param srcDirName 源目录名
    134      * @param descDirName 目标目录名
    135      * @param coverlay 如果目标目录存在,是否覆盖
    136      * @return 如果复制成功返回true,否则返回false
    137      */
    138     public static boolean copyDirectoryCover(String srcDirName,
    139             String descDirName, boolean coverlay) {
    140         File srcDir = new File(srcDirName);
    141         // 判断源目录是否存在
    142         if (!srcDir.exists()) {
    143             log.debug("复制目录失败,源目录 " + srcDirName + " 不存在!");
    144             return false;
    145         }
    146         // 判断源目录是否是目录
    147         else if (!srcDir.isDirectory()) {
    148             log.debug("复制目录失败," + srcDirName + " 不是一个目录!");
    149             return false;
    150         }
    151         // 如果目标文件夹名不以文件分隔符结尾,自动添加文件分隔符
    152         String descDirNames = descDirName;
    153         if (!descDirNames.endsWith(File.separator)) {
    154             descDirNames = descDirNames + File.separator;
    155         }
    156         File descDir = new File(descDirNames);
    157         // 如果目标文件夹存在
    158         if (descDir.exists()) {
    159             if (coverlay) {
    160                 // 允许覆盖目标目录
    161                 log.debug("目标目录已存在,准备删除!");
    162                 if (!FileUtils.delFile(descDirNames)) {
    163                     log.debug("删除目录 " + descDirNames + " 失败!");
    164                     return false;
    165                 }
    166             } else {
    167                 log.debug("目标目录复制失败,目标目录 " + descDirNames + " 已存在!");
    168                 return false;
    169             }
    170         } else {
    171             // 创建目标目录
    172             log.debug("目标目录不存在,准备创建!");
    173             if (!descDir.mkdirs()) {
    174                 log.debug("创建目标目录失败!");
    175                 return false;
    176             }
    177 
    178         }
    179 
    180         boolean flag = true;
    181         // 列出源目录下的所有文件名和子目录名
    182         File[] files = srcDir.listFiles();
    183         for (int i = 0; i < files.length; i++) {
    184             // 如果是一个单个文件,则直接复制
    185             if (files[i].isFile()) {
    186                 flag = FileUtils.copyFile(files[i].getAbsolutePath(),
    187                         descDirName + files[i].getName());
    188                 // 如果拷贝文件失败,则退出循环
    189                 if (!flag) {
    190                     break;
    191                 }
    192             }
    193             // 如果是子目录,则继续复制目录
    194             if (files[i].isDirectory()) {
    195                 flag = FileUtils.copyDirectory(files[i]
    196                         .getAbsolutePath(), descDirName + files[i].getName());
    197                 // 如果拷贝目录失败,则退出循环
    198                 if (!flag) {
    199                     break;
    200                 }
    201             }
    202         }
    203 
    204         if (!flag) {
    205             log.debug("复制目录 " + srcDirName + " 到 " + descDirName + " 失败!");
    206             return false;
    207         }
    208         log.debug("复制目录 " + srcDirName + " 到 " + descDirName + " 成功!");
    209         return true;
    210 
    211     }
    212 
    213     /**
    214      * 
    215      * 删除文件,可以删除单个文件或文件夹
    216      * 
    217      * @param fileName 被删除的文件名
    218      * @return 如果删除成功,则返回true,否是返回false
    219      */
    220     public static boolean delFile(String fileName) {
    221          File file = new File(fileName);
    222         if (!file.exists()) {
    223             log.debug(fileName + " 文件不存在!");
    224             return true;
    225         } else {
    226             if (file.isFile()) {
    227                 return FileUtils.deleteFile(fileName);
    228             } else {
    229                 return FileUtils.deleteDirectory(fileName);
    230             }
    231         }
    232     }
    233 
    234     /**
    235      * 
    236      * 删除单个文件
    237      * 
    238      * @param fileName 被删除的文件名
    239      * @return 如果删除成功,则返回true,否则返回false
    240      */
    241     public static boolean deleteFile(String fileName) {
    242         File file = new File(fileName);
    243         if (file.exists() && file.isFile()) {
    244             if (file.delete()) {
    245                 log.debug("删除文件 " + fileName + " 成功!");
    246                 return true;
    247             } else {
    248                 log.debug("删除文件 " + fileName + " 失败!");
    249                 return false;
    250             }
    251         } else {
    252             log.debug(fileName + " 文件不存在!");
    253             return true;
    254         }
    255     }
    256 
    257     /**
    258      * 
    259      * 删除目录及目录下的文件
    260      * 
    261      * @param dirName 被删除的目录所在的文件路径
    262      * @return 如果目录删除成功,则返回true,否则返回false
    263      */
    264     public static boolean deleteDirectory(String dirName) {
    265         String dirNames = dirName;
    266         if (!dirNames.endsWith(File.separator)) {
    267             dirNames = dirNames + File.separator;
    268         }
    269         File dirFile = new File(dirNames);
    270         if (!dirFile.exists() || !dirFile.isDirectory()) {
    271             log.debug(dirNames + " 目录不存在!");
    272             return true;
    273         }
    274         boolean flag = true;
    275         // 列出全部文件及子目录
    276         File[] files = dirFile.listFiles();
    277         for (int i = 0; i < files.length; i++) {
    278             // 删除子文件
    279             if (files[i].isFile()) {
    280                 flag = FileUtils.deleteFile(files[i].getAbsolutePath());
    281                 // 如果删除文件失败,则退出循环
    282                 if (!flag) {
    283                     break;
    284                 }
    285             }
    286             // 删除子目录
    287             else if (files[i].isDirectory()) {
    288                 flag = FileUtils.deleteDirectory(files[i]
    289                         .getAbsolutePath());
    290                 // 如果删除子目录失败,则退出循环
    291                 if (!flag) {
    292                     break;
    293                 }
    294             }
    295         }
    296 
    297         if (!flag) {
    298             log.debug("删除目录失败!");
    299             return false;
    300         }
    301         // 删除当前目录
    302         if (dirFile.delete()) {
    303             log.debug("删除目录 " + dirName + " 成功!");
    304             return true;
    305         } else {
    306             log.debug("删除目录 " + dirName + " 失败!");
    307             return false;
    308         }
    309 
    310     }
    311 
    312     /**
    313      * 创建单个文件
    314      * @param descFileName 文件名,包含路径
    315      * @return 如果创建成功,则返回true,否则返回false
    316      */
    317     public static boolean createFile(String descFileName) {
    318         File file = new File(descFileName);
    319         if (file.exists()) {
    320             log.debug("文件 " + descFileName + " 已存在!");
    321             return false;
    322         }
    323         if (descFileName.endsWith(File.separator)) {
    324             log.debug(descFileName + " 为目录,不能创建目录!");
    325             return false;
    326         }
    327         if (!file.getParentFile().exists()) {
    328             // 如果文件所在的目录不存在,则创建目录
    329             if (!file.getParentFile().mkdirs()) {
    330                 log.debug("创建文件所在的目录失败!");
    331                 return false;
    332             }
    333         }
    334 
    335         // 创建文件
    336         try {
    337             if (file.createNewFile()) {
    338                 log.debug(descFileName + " 文件创建成功!");
    339                 return true;
    340             } else {
    341                 log.debug(descFileName + " 文件创建失败!");
    342                 return false;
    343             }
    344         } catch (Exception e) {
    345             e.printStackTrace();
    346             log.debug(descFileName + " 文件创建失败!");
    347             return false;
    348         }
    349 
    350     }
    351 
    352     /**
    353      * 创建目录
    354      * @param descDirName 目录名,包含路径
    355      * @return 如果创建成功,则返回true,否则返回false
    356      */
    357     public static boolean createDirectory(String descDirName) {
    358         String descDirNames = descDirName;
    359         if (!descDirNames.endsWith(File.separator)) {
    360             descDirNames = descDirNames + File.separator;
    361         }
    362         File descDir = new File(descDirNames);
    363         if (descDir.exists()) {
    364             log.debug("目录 " + descDirNames + " 已存在!");
    365             return false;
    366         }
    367         // 创建目录
    368         if (descDir.mkdirs()) {
    369             log.debug("目录 " + descDirNames + " 创建成功!");
    370             return true;
    371         } else {
    372             log.debug("目录 " + descDirNames + " 创建失败!");
    373             return false;
    374         }
    375 
    376     }
    377 
    378     /**
    379      * 写入文件
    380      * @param file 要写入的文件
    381      */
    382     public static void writeToFile(String fileName, String content, boolean append) {
    383         try {
    384             FileUtils.write(new File(fileName), content, "utf-8", append);
    385             log.debug("文件 " + fileName + " 写入成功!");
    386         } catch (IOException e) {
    387             log.debug("文件 " + fileName + " 写入失败! " + e.getMessage());
    388         }
    389     }
    390 
    391     /**
    392      * 写入文件
    393      * @param file 要写入的文件
    394      */
    395     public static void writeToFile(String fileName, String content, String encoding, boolean append) {
    396         try {
    397             FileUtils.write(new File(fileName), content, encoding, append);
    398             log.debug("文件 " + fileName + " 写入成功!");
    399         } catch (IOException e) {
    400             log.debug("文件 " + fileName + " 写入失败! " + e.getMessage());
    401         }
    402     }
    403     
    404     /**
    405      * 压缩文件或目录
    406      * @param srcDirName 压缩的根目录
    407      * @param fileName 根目录下的待压缩的文件名或文件夹名,其中*或""表示跟目录下的全部文件
    408      * @param descFileName 目标zip文件
    409      */
    410     public static void zipFiles(String srcDirName, String fileName,
    411             String descFileName) {
    412         // 判断目录是否存在
    413         if (srcDirName == null) {
    414             log.debug("文件压缩失败,目录 " + srcDirName + " 不存在!");
    415             return;
    416         }
    417         File fileDir = new File(srcDirName);
    418         if (!fileDir.exists() || !fileDir.isDirectory()) {
    419             log.debug("文件压缩失败,目录 " + srcDirName + " 不存在!");
    420             return;
    421         }
    422         String dirPath = fileDir.getAbsolutePath();
    423         File descFile = new File(descFileName);
    424         try {
    425             ZipOutputStream zouts = new ZipOutputStream(new FileOutputStream(
    426                     descFile));
    427             if ("*".equals(fileName) || "".equals(fileName)) {
    428                 FileUtils.zipDirectoryToZipFile(dirPath, fileDir, zouts);
    429             } else {
    430                 File file = new File(fileDir, fileName);
    431                 if (file.isFile()) {
    432                     FileUtils.zipFilesToZipFile(dirPath, file, zouts);
    433                 } else {
    434                     FileUtils
    435                             .zipDirectoryToZipFile(dirPath, file, zouts);
    436                 }
    437             }
    438             zouts.close();
    439             log.debug(descFileName + " 文件压缩成功!");
    440         } catch (Exception e) {
    441             log.debug("文件压缩失败:" + e.getMessage());
    442             e.printStackTrace();
    443         }
    444 
    445     }
    446 
    447     /**
    448      * 解压缩ZIP文件,将ZIP文件里的内容解压到descFileName目录下
    449      * @param zipFileName 需要解压的ZIP文件
    450      * @param descFileName 目标文件
    451      */
    452     public static boolean unZipFiles(String zipFileName, String descFileName) {
    453         String descFileNames = descFileName;
    454         if (!descFileNames.endsWith(File.separator)) {
    455             descFileNames = descFileNames + File.separator;
    456         }        
    457         try {
    458             // 根据ZIP文件创建ZipFile对象
    459             ZipFile zipFile = new ZipFile(zipFileName);
    460             ZipEntry entry = null;
    461             String entryName = null;
    462             String descFileDir = null;
    463             byte[] buf = new byte[4096];
    464             int readByte = 0;
    465             // 获取ZIP文件里所有的entry
    466             @SuppressWarnings("rawtypes")
    467             Enumeration enums = zipFile.getEntries();
    468             // 遍历所有entry
    469             while (enums.hasMoreElements()) {
    470                 entry = (ZipEntry) enums.nextElement();
    471                 // 获得entry的名字
    472                 entryName = entry.getName();
    473                 descFileDir = descFileNames + entryName;
    474                 if (entry.isDirectory()) {
    475                     // 如果entry是一个目录,则创建目录
    476                     new File(descFileDir).mkdirs();
    477                     continue;
    478                 } else {
    479                     // 如果entry是一个文件,则创建父目录
    480                     new File(descFileDir).getParentFile().mkdirs();
    481                 }
    482                 File file = new File(descFileDir);
    483                 // 打开文件输出流
    484                 OutputStream os = new FileOutputStream(file);
    485                 // 从ZipFile对象中打开entry的输入流
    486                 InputStream is = zipFile.getInputStream(entry);
    487                 while ((readByte = is.read(buf)) != -1) {
    488                     os.write(buf, 0, readByte);
    489                 }
    490                 os.close();
    491                 is.close();
    492             }
    493             zipFile.close();
    494             log.debug("文件解压成功!");
    495             return true;
    496         } catch (Exception e) {
    497             log.debug("文件解压失败:" + e.getMessage());
    498             return false;
    499         }
    500     }
    501 
    502     /**
    503      * 将目录压缩到ZIP输出流
    504      * @param dirPath 目录路径
    505      * @param fileDir 文件信息
    506      * @param zouts 输出流
    507      */
    508     public static void zipDirectoryToZipFile(String dirPath, File fileDir,
    509             ZipOutputStream zouts) {
    510         if (fileDir.isDirectory()) {
    511             File[] files = fileDir.listFiles();
    512             // 空的文件夹
    513             if (files.length == 0) {
    514                 // 目录信息
    515                 ZipEntry entry = new ZipEntry(getEntryName(dirPath, fileDir));
    516                 try {
    517                     zouts.putNextEntry(entry);
    518                     zouts.closeEntry();
    519                 } catch (Exception e) {
    520                     e.printStackTrace();
    521                 }
    522                 return;
    523             }
    524 
    525             for (int i = 0; i < files.length; i++) {
    526                 if (files[i].isFile()) {
    527                     // 如果是文件,则调用文件压缩方法
    528                     FileUtils
    529                             .zipFilesToZipFile(dirPath, files[i], zouts);
    530                 } else {
    531                     // 如果是目录,则递归调用
    532                     FileUtils.zipDirectoryToZipFile(dirPath, files[i],
    533                             zouts);
    534                 }
    535             }
    536 
    537         }
    538 
    539     }
    540 
    541     /**
    542      * 将文件压缩到ZIP输出流
    543      * @param dirPath 目录路径
    544      * @param file 文件
    545      * @param zouts 输出流
    546      */
    547     public static void zipFilesToZipFile(String dirPath, File file,
    548             ZipOutputStream zouts) {
    549         FileInputStream fin = null;
    550         ZipEntry entry = null;
    551         // 创建复制缓冲区
    552         byte[] buf = new byte[4096];
    553         int readByte = 0;
    554         if (file.isFile()) {
    555             try {
    556                 // 创建一个文件输入流
    557                 fin = new FileInputStream(file);
    558                 // 创建一个ZipEntry
    559                 entry = new ZipEntry(getEntryName(dirPath, file));
    560                 // 存储信息到压缩文件
    561                 zouts.putNextEntry(entry);
    562                 // 复制字节到压缩文件
    563                 while ((readByte = fin.read(buf)) != -1) {
    564                     zouts.write(buf, 0, readByte);
    565                 }
    566                 zouts.closeEntry();
    567                 fin.close();
    568                 System.out
    569                         .println("添加文件 " + file.getAbsolutePath() + " 到zip文件中!");
    570             } catch (Exception e) {
    571                 e.printStackTrace();
    572             }
    573         }
    574 
    575     }
    576 
    577     /**
    578      * 获取待压缩文件在ZIP文件中entry的名字,即相对于跟目录的相对路径名
    579      * @param dirPat 目录名
    580      * @param file entry文件名
    581      * @return
    582      */
    583     private static String getEntryName(String dirPath, File file) {
    584         String dirPaths = dirPath;
    585         if (!dirPaths.endsWith(File.separator)) {
    586             dirPaths = dirPaths + File.separator;
    587         }
    588         String filePath = file.getAbsolutePath();
    589         // 对于目录,必须在entry名字后面加上"/",表示它将以目录项存储
    590         if (file.isDirectory()) {
    591             filePath += "/";
    592         }
    593         int index = filePath.indexOf(dirPaths);
    594 
    595         return filePath.substring(index + dirPaths.length());
    596     }
    597     
    598      /**
    599       * 修复路径,将 \ 或 / 等替换为 File.separator 
    600       * @param path
    601       * @return
    602       */
    603      public static String path(String path){
    604          String p = StringUtils.replace(path, "\", "/");
    605          p = StringUtils.join(StringUtils.split(p, "/"), "/");
    606          if (!StringUtils.startsWithAny(p, "/") && StringUtils.startsWithAny(path, "\", "/")){
    607              p += "/";
    608          }
    609          if (!StringUtils.endsWithAny(p, "/") && StringUtils.endsWithAny(path, "\", "/")){
    610              p = p + "/";
    611          }
    612          return p;
    613      }
    614 
    615 }

    转载请注明出处!

    http://www.cnblogs.com/libingbin/

    感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。

  • 相关阅读:
    C#中异步和多线程的区别
    猫 老鼠 人的编程题
    C#中数组、ArrayList和List三者的区别
    经典.net面试题目
    sql有几种删除表数据的方式
    内存池的实现
    A*算法为什么是最优的
    传教士与野人问题
    d3d导致cairo不正常
    c++中的signal机制
  • 原文地址:https://www.cnblogs.com/libingbin/p/6033004.html
Copyright © 2020-2023  润新知