package com.hx.util; import com.hx.exception.TipsException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.net.FileNameMap; import java.net.URLConnection; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; /** 文件处理工具 * @author ChenJiaHe * @Date 2020-06-17 */ public class FileUtils { private final static Logger logger = LoggerFactory.getLogger(FileUtils.class); private static int BUFFER_SIZE = 1024; /** * @param path * @MethodName fileIsExists * @Description 文件是否存在 * @Author ChenJiaHe * @Date 2019/9/7 9:13 * @Since JDK 1.8 */ public static boolean fileIsExists(String path) { File file = new File(path); if (file.exists()) { return true; } else { return false; } } /** * @param sourceFile * @param targetFile * @MethodName copyFile * @Description 复制文件 * @Author ChenJiaHe * @Date 2019/9/7 9:36 * @Since JDK 1.8 */ public static void copyFile(File sourceFile, File targetFile) throws IOException { BufferedInputStream inputStream = null; BufferedOutputStream outputStream = null; try { inputStream = new BufferedInputStream(new FileInputStream(sourceFile)); outputStream = new BufferedOutputStream(new FileOutputStream(targetFile)); byte[] b = new byte[BUFFER_SIZE]; int len; while ((len = inputStream.read(b)) != -1) { outputStream.write(b, 0, len); } outputStream.flush(); } catch (Exception e) { logger.error("copy file error", e); } finally { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } } } /** * @param path * @param fileType 文件类型,0 = 文件夹 1 = 文件 * @MethodName getAllFiles * @Description 讀取文件夹下的,不包括子文件夹内 * @Author ChenJiaHe * @Date 2019/9/17 15:56 * @Since JDK 1.8 */ public static List getAllFiles(String path, String fileType) { List fileList = new ArrayList<>(); File fileDic = new File(path); File[] files = fileDic.listFiles(); for (File file : files) { if ("1".equals(fileType)) { if (file.isFile()) { fileList.add(file.toString()); } } if ("0".equals(fileType)) { if (file.isDirectory()) { fileList.add(file.toString()); } } } return fileList; } /** * @param path * @MethodName getFolderFiles * @Description 递归获取所有包括子文件夹的文件 * @Author ChenJiaHe * @Date 2019/9/17 16:11 * @Since JDK 1.8 */ public static void getAllFileName(String path, List listFileName) { try { File file = new File(path); File[] files = file.listFiles(); String[] names = file.list(); if (names != null) { String[] completNames = new String[names.length]; for (int i = 0; i < names.length; i++) { completNames[i] = path + names[i]; } listFileName.addAll(Arrays.asList(completNames)); } for (File a : files) { // 如果文件夹下有子文件夹,获取子文件夹下的所有文件全路径。 if (a.isDirectory()) { getAllFileName(a.getAbsolutePath() + "\\", listFileName); } } } catch (Exception e) { e.printStackTrace(); } } /** * 读取文件内容,作为字符串返回 */ public static String readFileAsString(String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { throw new FileNotFoundException(filePath); } if (file.length() > 1024 * 1024 * 1024) { throw new IOException("File is too large"); } StringBuilder sb = new StringBuilder((int) (file.length())); // 创建字节输入流 FileInputStream fis = new FileInputStream(filePath); // 创建一个长度为10240的Buffer byte[] bbuf = new byte[10240]; // 用于保存实际读取的字节数 int hasRead = 0; while ( (hasRead = fis.read(bbuf)) > 0 ) { sb.append(new String(bbuf, 0, hasRead)); } fis.close(); return sb.toString(); } /** * 根据文件路径读取byte[] 数组 */ public static byte[] readFileByBytes(String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { throw new FileNotFoundException(filePath); } else { ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length()); BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(file)); short bufSize = 1024; byte[] buffer = new byte[bufSize]; int len1; while (-1 != (len1 = in.read(buffer, 0, bufSize))) { bos.write(buffer, 0, len1); } byte[] var7 = bos.toByteArray(); return var7; } finally { try { if (in != null) { in.close(); } } catch (IOException var14) { var14.printStackTrace(); } bos.close(); } } } /** * 2020-06-29 * cjh * 图片格式判断 * */ public static boolean imageFormatJudge(MultipartFile firs) { String imageName = firs.getOriginalFilename(); //截取格式 String suffix =imageName.substring(imageName.lastIndexOf(".") + 1); //格式字母转小写 suffix = suffix.toLowerCase(); //进行判断 if(suffix.equals("png")) { return true; }else if(suffix.equals("jpg")){ return true; }else if(suffix.equals("jpeg")){ return true; }else { return false; } } /**视频上传的方法 * 保存到服务器里面的 * @param platformIconFile 视频文件 * @param unifiedFolder NG指向的前端文件夹(统一文件夹),如:user/local/images/ * @param saveFolder 保存到的文件夹,如:/bananer/ * @param autoDateFolder 是否生成日期文件夹 * @return 图片路径 * 2020-06-29 ChenJiaHe */ public static String videoFileUpload(MultipartFile platformIconFile,String unifiedFolder,String saveFolder ,boolean autoDateFolder) { String fileName = ""; try { if(platformIconFile == null) { throw new TipsException("请上传视频文件!"); } if(!getMimeType(platformIconFile.getOriginalFilename())){ throw new TipsException("请上传视频格式的文件!"); } //设置图片大小 // String.format("%.1f",platformIconFile.getSize()/1024.0); if(autoDateFolder){ if(saveFolder.endsWith("/")){ saveFolder = saveFolder+dateFormat(new Date(),"yyyyMM")+"/"; }else{ saveFolder = saveFolder+"/"+dateFormat(new Date(),"yyyyMM")+"/"; } } fileName = dateFormat(new Date(),"yyyyMMddHHmmssSSS"); if(unifiedFolder.endsWith("/")){ if(saveFolder.startsWith("/")){ saveFolder = saveFolder.replaceFirst("/",""); unifiedFolder = unifiedFolder + saveFolder; }else{ unifiedFolder = unifiedFolder+saveFolder; } }else{ if(saveFolder.startsWith("/")){ unifiedFolder = unifiedFolder + saveFolder; }else{ unifiedFolder = unifiedFolder+"/"+saveFolder; } } fileName = saveFolder+fileUp(platformIconFile,unifiedFolder,fileName); } catch (RuntimeException e) { e.printStackTrace(); } return fileName; } /**图片上传的方法 * 保存到服务器里面的 * @param platformIconFile 图片文件 * @param unifiedFolder NG指向的前端文件夹(统一文件夹),如:user/local/images/ * @param saveFolder 保存到的文件夹,如:/bananer/ * @param autoDateFolder 是否生成日期文件夹 * @return 图片路径 * 2020-06-29 ChenJiaHe */ public static String handleFileUpload(MultipartFile platformIconFile,String unifiedFolder,String saveFolder ,boolean autoDateFolder) { String fileName = ""; try { if(platformIconFile == null) { throw new TipsException("请上传图片!"); } if(!imageFormatJudge(platformIconFile)) { throw new TipsException("请上传png、jpg和jpeg格式的图片!"); } //设置图片大小 // String.format("%.1f",platformIconFile.getSize()/1024.0); if(autoDateFolder){ if(saveFolder.endsWith("/")){ saveFolder = saveFolder+dateFormat(new Date(),"yyyyMM")+"/"; }else{ saveFolder = saveFolder+"/"+dateFormat(new Date(),"yyyyMM")+"/"; } } fileName = dateFormat(new Date(),"yyyyMMddHHmmssSSS"); if(unifiedFolder.endsWith("/")){ if(saveFolder.startsWith("/")){ saveFolder = saveFolder.replaceFirst("/",""); unifiedFolder = unifiedFolder + saveFolder; }else{ unifiedFolder = unifiedFolder+saveFolder; } }else{ if(saveFolder.startsWith("/")){ unifiedFolder = unifiedFolder + saveFolder; }else{ unifiedFolder = unifiedFolder+"/"+saveFolder; } } fileName = saveFolder+fileUp(platformIconFile,unifiedFolder,fileName); } catch (RuntimeException e) { e.printStackTrace(); } return fileName; } /** * 音频上传 * @param platformIconFile * @param unifiedFolder * @param saveFolder * @param autoDateFolder * @return */ public static String handleAudioUpload(MultipartFile platformIconFile,String unifiedFolder,String saveFolder ,boolean autoDateFolder) { String fileName = ""; try { if(platformIconFile == null) { throw new TipsException("请上传音频!"); } if(autoDateFolder){ if(saveFolder.endsWith("/")){ saveFolder = saveFolder+dateFormat(new Date(),"yyyyMM")+"/"; }else{ saveFolder = saveFolder+"/"+dateFormat(new Date(),"yyyyMM")+"/"; } } fileName = dateFormat(new Date(),"yyyyMMddHHmmssSSS"); if(unifiedFolder.endsWith("/")){ if(saveFolder.startsWith("/")){ saveFolder = saveFolder.replaceFirst("/",""); unifiedFolder = unifiedFolder + saveFolder; }else{ unifiedFolder = unifiedFolder+saveFolder; } }else{ if(saveFolder.startsWith("/")){ unifiedFolder = unifiedFolder + saveFolder; }else{ unifiedFolder = unifiedFolder+"/"+saveFolder; } } fileName = saveFolder+fileUp(platformIconFile,unifiedFolder,fileName); } catch (RuntimeException e) { e.printStackTrace(); } return fileName; } /** * 文件上传 * @param platformIconFile * @param unifiedFolder * @param saveFolder * @param autoDateFolder * @return */ public static String handleOtherFileUpload(MultipartFile platformIconFile,String unifiedFolder,String saveFolder ,boolean autoDateFolder) { String fileName = ""; try { if(platformIconFile == null) { throw new TipsException("请上传文件!"); } if(autoDateFolder){ if(saveFolder.endsWith("/")){ saveFolder = saveFolder+dateFormat(new Date(),"yyyyMM")+"/"; }else{ saveFolder = saveFolder+"/"+dateFormat(new Date(),"yyyyMM")+"/"; } } fileName = dateFormat(new Date(),"yyyyMMddHHmmssSSS"); if(unifiedFolder.endsWith("/")){ if(saveFolder.startsWith("/")){ saveFolder = saveFolder.replaceFirst("/",""); unifiedFolder = unifiedFolder + saveFolder; }else{ unifiedFolder = unifiedFolder+saveFolder; } }else{ if(saveFolder.startsWith("/")){ unifiedFolder = unifiedFolder + saveFolder; }else{ unifiedFolder = unifiedFolder+"/"+saveFolder; } } fileName = saveFolder+fileUp(platformIconFile,unifiedFolder,fileName); } catch (RuntimeException e) { e.printStackTrace(); } return fileName; } /** * 2020-06-29 ChenJiaHe      * @param file             //文件对象      * @param filePath        //上传路径      * @param fileName        //文件名      * @return  文件名      */ public static String fileUp(MultipartFile file, String filePath, String fileName){ String extName = ""; // 扩展名格式: try { if (file.getOriginalFilename().lastIndexOf(".") >= 0){ extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); } copyFile(file.getInputStream(), filePath, fileName+extName).replaceAll("-", ""); } catch (IOException e) { System.out.println(e); } return fileName+extName; } /**      * 写文件到当前目录的upload目录中      *      * @param in      * @param fileName      * @throws IOException      */ private static String copyFile(InputStream in, String dir, String realName)throws IOException { File file = new File(dir, realName); file.setWritable(true); if (!file.exists()) { if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } file.createNewFile(); } org.apache.commons.io.FileUtils.copyInputStreamToFile(in, file); return realName; } /** * * @param date 时间 * @param format 时间格式 * @return 返回的时间格式字符串 */ public static String dateFormat(Date date,String format) { SimpleDateFormat df = new SimpleDateFormat(format);//设置日期格式 return df.format(date); } /** * @param stream 文件流 * @param saveUrl 保存到的文件夹 * @param fileName 文件图片 * @return * @throws IOException */ public static File inputStreamToFile(InputStream stream,String saveUrl,String fileName) throws IOException { if(saveUrl.endsWith("/")){ saveUrl = saveUrl + fileName; }else{ saveUrl = saveUrl +"/"+ fileName; } File targetFile = new File(saveUrl); org.apache.commons.io.FileUtils.copyInputStreamToFile(stream, targetFile); return targetFile; } /**判断是不是视频文件 * @param fileName 文件名称 * @return boolean true是视频文件 */ public static boolean getMimeType(String fileName) { boolean b = false; FileNameMap fileNameMap = URLConnection.getFileNameMap(); String type = fileNameMap.getContentTypeFor(fileName); //是视频type是为空的 if(StringUtils.isEmpty(type)) { b = true; } return b; } /** * 判断是否为视频 * @param fileName * @return */ public static String isVideo(String fileName) { FileNameMap fileNameMap = URLConnection.getFileNameMap(); String type = fileNameMap.getContentTypeFor(fileName); return type; } }