FileUtil.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package com.mooctest.crowd.site.util;
  2. import cn.afterturn.easypoi.excel.ExcelImportUtil;
  3. import cn.afterturn.easypoi.excel.entity.ImportParams;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.web.multipart.MultipartFile;
  6. import java.io.*;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.NoSuchElementException;
  11. /**
  12. * @author: Diors.Po
  13. * @Email: 171256175@qq.com
  14. * @date 2019-08-05 19:57
  15. */
  16. @Slf4j
  17. public class FileUtil {
  18. public static final Map<String, String> FILE_TYPE_MAP = new HashMap<>(); //本系统中合法的文件类型
  19. static {
  20. //图片
  21. FILE_TYPE_MAP.put("ffd8ff", "jpg"); //JPEG (jpg)
  22. FILE_TYPE_MAP.put("89504e", "png"); //PNG (png)
  23. FILE_TYPE_MAP.put("474946", "gif"); //GIF (gif)
  24. FILE_TYPE_MAP.put("49492a", "tif"); //TIFF (tif)
  25. FILE_TYPE_MAP.put("492049", "tif");
  26. FILE_TYPE_MAP.put("4d4d00", "tif");
  27. FILE_TYPE_MAP.put("424d22", "bmp"); //16色位图(bmp)
  28. FILE_TYPE_MAP.put("424d82", "bmp"); //24位位图(bmp)
  29. FILE_TYPE_MAP.put("424d8e", "bmp"); //256色位图(bmp)
  30. //压缩文件
  31. FILE_TYPE_MAP.put("504b03", "zip");
  32. FILE_TYPE_MAP.put("504b05", "zip");
  33. FILE_TYPE_MAP.put("504b07", "zip");
  34. FILE_TYPE_MAP.put("526172", "rar");
  35. //文档
  36. FILE_TYPE_MAP.put("255044", "pdf"); //Adobe Acrobat (pdf)
  37. FILE_TYPE_MAP.put("504b03", "docx");//docx文件,xlsx等一致
  38. FILE_TYPE_MAP.put("d0cf11", "doc/dot"); //MS Excel 注意:word、msi 和 excel的文件头一样
  39. FILE_TYPE_MAP.put("0d444f", "doc/dot");
  40. FILE_TYPE_MAP.put("cf11e0", "doc/dot");
  41. FILE_TYPE_MAP.put("dba52d", "doc/dot");
  42. FILE_TYPE_MAP.put("d0cf11", "wps/wks");//WPS文字wps、表格et、演示dps都是一样的
  43. FILE_TYPE_MAP.put("0e574b", "wps/wks");
  44. FILE_TYPE_MAP.put("ff0002", "wps/wks");
  45. //exe可执行文件
  46. FILE_TYPE_MAP.put("4d5a90", "exe");
  47. }
  48. public static String save(String dirPath, MultipartFile inputFile, String fileName) throws IOException {
  49. byte[] bs = new byte[1024];
  50. int len;
  51. File saveDir = new File(dirPath);
  52. if (!saveDir.exists()) {
  53. saveDir.mkdirs();
  54. }
  55. if(fileName.equals("")){
  56. fileName = inputFile.getOriginalFilename();
  57. }
  58. String saveFilePath = saveDir.getPath() + "/" + fileName;
  59. OutputStream os = new FileOutputStream( saveFilePath );
  60. InputStream is = inputFile.getInputStream();
  61. while ((len = is.read(bs)) != -1) {
  62. os.write(bs, 0, len);
  63. }
  64. os.close();
  65. is.close();
  66. return saveFilePath.replaceAll("\\\\", "/" );
  67. }
  68. public static boolean checkFile(InputStream inputStream){
  69. try {
  70. byte[] headBytes = new byte[3];
  71. inputStream.read(headBytes, 0, headBytes.length);
  72. String headStr = bytesToHexString(headBytes).toLowerCase();
  73. log.info("The Head of File: "+headStr);
  74. // log.info("Whether the map contain the " + headStr +": " + FILE_TYPE_MAP.containsKey(headStr));
  75. return FILE_TYPE_MAP.containsKey(headStr);
  76. } catch (IOException e) {
  77. e.printStackTrace();
  78. }
  79. return true;
  80. }
  81. public static boolean checkExcel(InputStream inputStream){
  82. String headStr = getHeadStr(inputStream);
  83. log.info("The Head of File: "+headStr);
  84. String name = FILE_TYPE_MAP.get(headStr);
  85. if (name == null || (!name.contains("doc")&&(!name.contains("wps"))))
  86. return false;
  87. return true;
  88. }
  89. public static String getHeadStr(InputStream inputStream){
  90. try {
  91. byte[] headBytes = new byte[3];
  92. inputStream.read(headBytes, 0, headBytes.length);
  93. return bytesToHexString(headBytes).toLowerCase();
  94. } catch (IOException e) {
  95. throw new RuntimeException("读取文件头出错!", e);
  96. }
  97. }
  98. private static String bytesToHexString(byte[] src) {
  99. StringBuilder builder = new StringBuilder();
  100. if (src == null || src.length <= 0) {
  101. return null;
  102. }
  103. String hv;
  104. for (int i = 0; i < src.length; i++) {
  105. // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
  106. hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
  107. if (hv.length() < 2) {
  108. builder.append(0);
  109. }
  110. builder.append(hv);
  111. }
  112. System.out.println("HexString: " + builder.toString());
  113. return builder.toString();
  114. }
  115. public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){
  116. if (file == null){
  117. return null;
  118. }
  119. ImportParams params = new ImportParams();
  120. params.setTitleRows(titleRows);
  121. params.setHeadRows(headerRows);
  122. List<T> list = null;
  123. try {
  124. list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
  125. }catch (NoSuchElementException e){
  126. log.info("excel文件不能为空");
  127. throw new RuntimeException("excel文件不能为空");
  128. } catch (Exception e) {
  129. throw new RuntimeException(e);
  130. }
  131. return list;
  132. }
  133. }