FileUpload上传文件及读取 .ini 文件内容

来源:互联网 发布:ubuntu双系统分区方案 编辑:程序博客网 时间:2024/05/21 02:49
package cn.easted.edm.core.utils;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FilenameFilter;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.nio.charset.Charset;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Enumeration;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.ForkJoinTask;import java.util.concurrent.RecursiveTask;import java.util.zip.GZIPInputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import javax.servlet.http.HttpServletRequest;import org.apache.tools.tar.TarEntry;import org.apache.tools.tar.TarInputStream;import org.springframework.util.FileCopyUtils;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.multipart.MultipartHttpServletRequest;import cn.easted.edm.core.generic.common.Constant;import cn.easted.edm.web.exception.MyException;public class FileOperateUtil {    public static final String REALNAME = "realName";    public static final String STORENAME = "storeName";    public static final String PATH = "path";    public static final String SIZE = "size";    public static final String SUFFIX = "suffix";    public static final String CONTENTTYPE = "contentType";    public static final String UPLOADTIME = "uploadTime";    public static final String UPLOADDIR = "uploadDir";    public static final String PUBLISHTIME = "publishTime";    public static final String VERSIONNUMBER = "versionnumber";    public static final String SYSTEM = "system";    public static final String FUNCTION = "function";    private static Map<String,Object> iniMap = new HashMap<String, Object>();    /**     * 上传文件     *      * @param request     * @param params     * @param values     * @return List<Map<String,Object>>     * @throws Exception     * @author Wanghao     */    @SuppressWarnings("unused")    public static Map<String, Object> upload(HttpServletRequest request) {        Map<String, Object> map = new HashMap<String, Object>();        MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;        Map<String, MultipartFile> fileMap = mRequest.getFileMap();        String uploadDir = request.getSession().getServletContext().getRealPath("/") + FileOperateUtil.UPLOADDIR;        File file = new File(uploadDir);        if (!file.exists()) {            file.mkdir();        }        String fileName = null;        int i = 0;        for (Iterator<Map.Entry<String, MultipartFile>> it = fileMap.entrySet().iterator(); it.hasNext(); i++) {            Map.Entry<String, MultipartFile> entry = it.next();            MultipartFile mFile = entry.getValue();            // 原始文件名            fileName = mFile.getOriginalFilename();            // 存储文件名            String storeName = rename(fileName);            String noZipName = uploadDir + storeName;            // 压缩后的文件名            String zipName = zipName(noZipName);            // 存储路径            String path = uploadDir + File.separator + storeName;            // 上传成为压缩文件            // ZipOutputStream outputStream = new ZipOutputStream(new            // BufferedOutputStream(new FileOutputStream(zipName)));            // outputStream.putNextEntry(new ZipEntry(fileName));            // outputStream.setEncoding("GBK");            File newFile = new File(path);            try {                FileCopyUtils.copy(mFile.getBytes(), newFile);                // 解析文件                String newPath = null;                String system = null;                if (".zip".equals(fileName.substring(fileName.lastIndexOf(".")))) {                    newPath = path.substring(0, path.lastIndexOf("."));                    system = Constant.SYSTEM_WINDOWS;                    unZip(newFile, newPath);                    traverseFolder(newPath);                } else if (".gz".equals(fileName.substring(fileName.lastIndexOf(".")))) {                    newPath = path.substring(0, path.length()-7);                    system = Constant.SYSTEM_LINUX;                    unTarGz(newFile, newPath);                    traverseFolder(newPath);                }                // 固定参数值对                map.put(FileOperateUtil.REALNAME, fileName);                map.put(FileOperateUtil.STORENAME, storeName);                map.put(FileOperateUtil.PATH, newPath + File.separator + fileName.substring(0, fileName.indexOf(".")));                final long total = forkJoinPool.invoke(new FileSizeFinder(new File(newPath)));                map.put(FileOperateUtil.SIZE, total);                map.put(FileOperateUtil.SUFFIX, Constant.SYSTEM_WINDOWS.equals(system) ? ".zip" : ".tar.gz");                map.put(FileOperateUtil.CONTENTTYPE, "application/octet-stream");                map.put(FileOperateUtil.UPLOADTIME, new Date());                String publishTime = (String)iniMap.get("publishTime");                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");                map.put(FileOperateUtil.PUBLISHTIME, sdf.parse(publishTime));                map.put(FileOperateUtil.VERSIONNUMBER, iniMap.get("versionNumber"));                map.put(FileOperateUtil.SYSTEM, system);                map.put(FileOperateUtil.FUNCTION, iniMap.get("function"));            } catch (Exception e) {                throw new MyException("100", e.getMessage());            }        }        return map;    }    /**     * 遍历文件夹下文件找到.ini结尾文件并读取内容     * @param path     *            文件路径     * @author Wanghao     * @return      * @throws Exception     */    private static Map<String, Object> traverseFolder(String path) throws Exception {        System.out.println(path);        File file = new File(path);        if (file.exists()) {            //判断ini文件是否存在            MyFilter filter = new MyFilter(".ini");            File[] iniFiles = file.listFiles(filter);            if(iniFiles.length == 0){                throw new MyException("100", "ini文件不存在!");            }            File[] files = file.listFiles();            if (files.length == 0) {                throw new Exception("文件夹是空的!");            } else {                for (File file2 : files) {                    if (file2.isDirectory()) {                        System.out.println("文件夹:" + file2.getAbsolutePath());                        traverseFolder(file2.getAbsolutePath());                    } else {                        // System.out.println("文件:" + file2.getAbsolutePath());                        System.out.println("文件:" + file2.getName());                        if (file2.getName().lastIndexOf(".") != -1                                && ".ini".equals(file2.getName().substring(file2.getName().lastIndexOf(".")))) {                            setValue(file2);                            return iniMap;                        }                    }                }            }        } else {            throw new MyException("100", "文件不存在!");        }        return iniMap;    }    /**     * 赋值    * @param file2 文件    * void    * @author Wanghao     */    @SuppressWarnings("unchecked")    private static void setValue(File file2) {        Map<String, Object> ini = IniFileReadUtil.readIniFile(file2.getAbsolutePath());        for (String k : ini.keySet()) {            System.out.println(k + ini.get(k));        }        // System.out.println(((Map<String,        // String>)ini.get("owner")).get("name"));        String versionName = ((Map<String, String>) ini.get("global")).get("versionName");        String versionNumber = ((Map<String, String>) ini.get("global")).get("versionNumber");        String function = ((Map<String, String>) ini.get("global")).get("function");        String publishTime = ((Map<String, String>) ini.get("global")).get("publishTime");        iniMap.put("versionName", versionName);        iniMap.put("versionNumber", versionNumber);        iniMap.put("function", function);        iniMap.put("publishTime", publishTime);    }    public static void main(String[] args) throws Exception {        File file = new File("E:\\Document\\ee.zip");        unZip(file, "E:\\Document");        traverseFolder("E:\\Document\\ee");    }    /**     * 返回当前目录下以某一字母结尾的文件    * @ClassName: MyFilter    * @author Wanghao    * @date 2017年6月23日 下午2:53:56     */    static class MyFilter implements FilenameFilter{          private String type;          public MyFilter(String type){              this.type = type;          }          public boolean accept(File dir,String name){              //return name.endsWith(type);               File f = new File(dir.getPath() + File.separator + name);               if(name.endsWith(type) || f.isDirectory()){                   return true;               }               return false;          }      }      /**     * 解压缩zip文件     *      * @param file     *            要解压的zip文件对象     * @param outputDir     *            要解压到某个指定的目录下     * @throws IOException     * @author Wanghao     */    public static void unZip(File file, String outputDir) throws IOException {        ZipFile zipFile = null;        try {            Charset CP866 = Charset.forName("CP866");            zipFile = new ZipFile(file, CP866);            // 创建输出目录            createDirectory(outputDir, null);            Enumeration<?> enums = zipFile.entries();            while (enums.hasMoreElements()) {                ZipEntry entry = (ZipEntry) enums.nextElement();                System.out.println("解压." + entry.getName());                // 如果是目录                if (entry.isDirectory()) {                    // 创建空目录                    createDirectory(outputDir, entry.getName());                } else {                    // 是文件                    File tmpFile = new File(outputDir + File.separator + entry.getName());                    // 创建输出目录                    createDirectory(tmpFile.getParent() + File.separator, null);                    InputStream in = null;                    OutputStream out = null;                    try {                        in = zipFile.getInputStream(entry);                        ;                        out = new FileOutputStream(tmpFile);                        int length = 0;                        byte[] b = new byte[2048];                        while ((length = in.read(b)) != -1) {                            out.write(b, 0, length);                        }                    } catch (IOException ex) {                        throw ex;                    } finally {                        if (in != null)                            in.close();                        if (out != null)                            out.close();                    }                }            }        } catch (IOException e) {            throw new MyException("100", "解压缩文件出现异常");        } finally {            try {                if (zipFile != null) {                    zipFile.close();                }            } catch (IOException ex) {                throw new MyException("100", "关闭zipFile出现异常");            }        }    }    /**     * 解压tar.gz 文件     *      * @param file     *            要解压的tar.gz文件对象     * @param outputDir     *            要解压到某个指定的目录下     * @throws IOException     * @author Wanghao     */    public static void unTarGz(File file, String outputDir) throws IOException {        TarInputStream tarIn = null;        try {            tarIn = new TarInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))),                    1024 * 2);            // 创建输出目录            createDirectory(outputDir, null);            TarEntry entry = null;            while ((entry = tarIn.getNextEntry()) != null) {                // 是目录                if (entry.isDirectory()) {                    entry.getName();                    // 创建空目录                    createDirectory(outputDir, entry.getName());                } else {// 是文件                    File tmpFile = new File(outputDir + File.separator + entry.getName());                    // 创建输出目录                    createDirectory(tmpFile.getParent() + File.separator, null);                    OutputStream out = null;                    try {                        out = new FileOutputStream(tmpFile);                        int length = 0;                        byte[] b = new byte[2048];                        while ((length = tarIn.read(b)) != -1) {                            out.write(b, 0, length);                        }                    } catch (IOException ex) {                        throw ex;                    } finally {                        if (out != null)                            out.close();                    }                }            }        } catch (IOException ex) {            throw new IOException("解压归档文件出现异常", ex);        } finally {            try {                if (tarIn != null) {                    tarIn.close();                }            } catch (IOException ex) {                throw new IOException("关闭tarFile出现异常", ex);            }        }    }    /**     * 将上传的文件进行重命名     *      * @param name     *            文件名     * @return String     * @author Wanghao     */    private static String rename(String name) {        Long now = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));        Long random = (long) (Math.random() * now);        String fileName = now + "" + random;        if (name.lastIndexOf(".") != -1 && ".gz".equals(name.substring(name.lastIndexOf(".")))) {            fileName += ".tar.gz";        } else {            if (name.indexOf(".") != -1) {                fileName += name.substring(name.lastIndexOf("."));            }        }        return fileName;    }    /**     * 压缩后的文件名     *      * @param name     *            文件名     * @return String     * @author Wanghao     */    private static String zipName(String name) {        String prefix = "";        if (name.indexOf(".") != -1) {            prefix = name.substring(0, name.lastIndexOf("."));        } else {            prefix = name;        }        return prefix + ".zip";    }    /**     * 构建目录     *      * @param outputDir     *            输出目录路径     * @param subDir     *            子目录路径     * @author Wanghao     */    private static void createDirectory(String outputDir, String subDir) {        File file = new File(outputDir);        if (!(subDir == null || subDir.trim().equals(""))) {// 子目录不为空            file = new File(outputDir + File.separator + subDir);        }        if (!file.exists()) {            if (!file.getParentFile().exists())                file.getParentFile().mkdirs();            file.mkdirs();        }    }     private final static ForkJoinPool forkJoinPool = new ForkJoinPool();     /**      * 获取文件夹大小     * @ClassName: FileSizeFinder     * @author Wanghao     * @date 2017年6月26日 下午3:23:22      */     private static class FileSizeFinder extends RecursiveTask<Long> {         /**          * 序列化          */         private static final long serialVersionUID = 1L;         final File file;         /**          * 获取文件夹大小          * @param theFile 目录文件          */         public FileSizeFinder(final File theFile) {             file = theFile;         }         @Override         public Long compute() {             long size = 0;             if (file.isFile()) {                 size = file.length();             } else {                 final File[] children = file.listFiles();                 if (children != null) {                     List<ForkJoinTask<Long>> tasks = new ArrayList<ForkJoinTask<Long>>();                     for (final File child : children) {                         if (child.isFile()) {                             size += child.length();                         } else {                             tasks.add(new FileSizeFinder(child));                         }                     }                     for (final ForkJoinTask<Long> task : invokeAll(tasks)) {                         size += task.join();                     }                 }             }             return size;         }     }    /**     * 删除文件     * @param fileName 文件名     * @param path 路径     * @return     */    public static Boolean deleteFile(String path) {        File file = new File(path);        if (file.exists()){            if (file.delete()){                return true;            }        }        return false;    }    /**     * 删除服务器上解压文件夹     * @param fileName     * @param path     * @return     * @author wangdn     */    public static Boolean deleteFolder(String fileName,String path){        //解析文件        if (".zip".equals(fileName.substring(fileName.lastIndexOf(".")))){            String newDicPath = path.substring(0, path.lastIndexOf("."));            File file = new File(newDicPath);            Boolean bd = deleteAllFilesOfDir(file);            return bd;        }else if (".gz".equals(fileName.substring(fileName.lastIndexOf(".")))){            String newTarPath = path.substring(0,path.length()-7);            File file = new File(newTarPath);            Boolean bd = deleteAllFilesOfDir(file);            return bd;        }        return false;    }    /**     * 删除文件夹的办法     * @param path 文件夹路径     * @author wangdn     */     public static Boolean deleteAllFilesOfDir(File path) {        if (!path.exists())              return false;          if (path.isFile()) {              if (path.delete()){                return true;            }            return false;          }          File[] files = path.listFiles();          for (int i = 0; i < files.length; i++) {              deleteAllFilesOfDir(files[i]);          }          if (path.delete()){            return true;        }else{            return false;        }    }  }package cn.easted.edm.core.utils;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.commons.io.input.BOMInputStream;/** * 读取ini文件工具类 * @ClassName: IniFileReadUtil * @author Wanghao * @date 2017年6月22日 下午5:55:06 */public class IniFileReadUtil {    /**      * 读取 INI 文件,存放到Map中      *       * 支持以‘#’或‘;’开头的注释;      * 支持行连接符(行末的'\'标记);      * 支持缺省的global properties;      * 支持list格式(非name=value格式处理为list格式);      * 支持空行、name/value前后的空格;      * 如果有重名,取最后一个;      * 格式(例子)如下      * # 我是注释      * ; 我也是注释      *       * name0=value0  # 我是global properties      * name10=value10      *       * [normal section] # 我是普通的section      * name1=value1 # 我是name和value      * [list section] # 我是只有value的section,以第一个是否包含'='为判断标准      * value1      * value2      *       * @param fileName 文件名     * @return Map<sectionName, object> object是一个Map(存放name=value对)或List(存放只有value的properties)      */      public static Map<String, Object> readIniFile(String fileName){          Map<String, List<String>> listResult = new HashMap<>();          Map<String, Object> result = new HashMap<>();          String globalSection = "global"; //Map中存储的global properties的key          File file = new File(fileName);          BufferedReader reader = null;          try {              //使用BOMInputStream自动去除UTF-8中的BOM            reader = new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream(file)), "UTF-8"));              String str = null;              String currentSection = globalSection; //处理缺省的section              List<String> currentProperties = new ArrayList<>();              boolean lineContinued = false;              String tempStr = null;              //一次读入一行(非空),直到读入null为文件结束 ,先全部放到listResult<String, List>中              while ((str = reader.readLine()) != null) {                  str = removeIniComments(str).trim(); //去掉尾部的注释、去掉首尾空格                  if ("".equals(str) || str == null){                      continue;                  }                  //如果前一行包括了连接符'\'                  if (lineContinued == true){                      str = tempStr + str;                  }                  //处理行连接符'\'                  if (str.endsWith("\\")){                      lineContinued = true;                      tempStr = str.substring(0,str.length() - 1);                      continue;                  }else {                      lineContinued = false;                  }                  //是否一个新section开始了                  if (str.startsWith("[") && str.endsWith("]")){                      String newSection = str.substring(1, str.length() - 1).trim();                      //如果新section不是现在的section,则把当前section存进listResult中                      if (!currentSection.equals(newSection)){                          listResult.put(currentSection, currentProperties);                          currentSection = newSection;                          //新section是否重复的section,如果是,则使用原来的list来存放properties,如果不是,则new一个List来存放properties                          currentProperties=listResult.get(currentSection);                          if (currentProperties==null){                              currentProperties = new ArrayList<>();                          }                      }                  }else{                      currentProperties.add(str);                  }              }              //把最后一个section存进listResult中              listResult.put(currentSection, currentProperties);              reader.close();          } catch (IOException e) {              e.printStackTrace();          } finally {              if (reader != null) {                  try {                      reader.close();                  } catch (IOException e1) {                  }              }          }          //整理拆开name=value对,并存放到MAP中:          //从listResult<String, List>中,看各个list中的元素是否包含等号“=”,如果包含,则拆开并放到Map中          //整理后,把结果放进result<String, Object>中          for(String key : listResult.keySet()){              List<String> tempList = listResult.get(key);              //空section不放到结果里面              if(tempList==null||tempList.size()==0){                  continue;              }              if(tempList.get(0).contains("=")){ //name=value对,存放在MAP里面                  Map<String, String> properties = new HashMap<>();                  for (String s : tempList){                      int delimiterPos = s.indexOf("=");                      //处理等号前后的空格                      properties.put(s.substring(0,delimiterPos).trim(), s.substring(delimiterPos+1, s.length()).trim());                  }                  result.put(key, properties);              }else{ //只有value,则获取原来的list                  result.put(key, listResult.get(key));              }          }          return result;      }      /**      * 去除ini文件中的注释,以";"或"#"开头,顺便去除UTF-8等文件的BOM头      * @param source      * @return      */      private static String removeIniComments(String source){          String result = source;          if(result.contains(";")){              result = result.substring(0, result.indexOf(";"));          }          if(result.contains("#")){              result = result.substring(0, result.indexOf("#"));          }          return result.trim();      }  }
原创粉丝点击