package org.jeecg.modules.utils.file; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.api.vo.FileUploadResult; import org.jeecg.common.util.SHA256Util; import org.jeecg.modules.utils.DateUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.Date; @Slf4j @Component public class FileUtils { private static String fileUploadFolder; @Value("${jeecg.path.upload}") public void setFileUploadFolder(String fileUploadFolder) { FileUtils.fileUploadFolder = fileUploadFolder; } /** * 文件路径上传保存 * @param filePath * @return */ public static FileUploadResult uploadFilePath(String filePath) { File file = new File(filePath); if(file == null) { return null; } String fileName = file.getName(); String suffix = getFileSuffix(fileName); Date currentDate = DateUtil.getNow(); String monthStr = DateUtil.format(currentDate, DateUtil.STR_YEAR_MONTH); //相对路径 String relativePath = "/" + monthStr + "/" + DateUtil.getDayStr(currentDate) + "/"; //绝对路径 String absolutePath = fileUploadFolder + "/" + monthStr + "/" + DateUtil.getDayStr(currentDate) + "/"; String fileNameNonSuffix = getFilenameNonSuffix(fileName); if(fileNameNonSuffix == null) return null; String encodeFileName = SHA256Util.getSHA256Str(fileNameNonSuffix + System.currentTimeMillis()); if(StringUtils.isNotBlank(suffix)) { encodeFileName = encodeFileName + "." + suffix; } Long b = uploadFileInput(file, absolutePath, encodeFileName); FileUploadResult dto = new FileUploadResult(); dto.setFileName(fileNameNonSuffix); dto.setFilePath(encodeFileName); dto.setFilePath(relativePath); dto.setFileSize(b); dto.setFileSuffix(suffix); return dto; } /** * 文件File上传保存 * @param file * @return */ public static FileUploadResult uploadFileInFile(File file) { if(file == null) { return null; } String fileName = file.getName(); String suffix = getFileSuffix(fileName); Date currentDate = DateUtil.getNow(); String monthStr = DateUtil.format(currentDate, DateUtil.STR_YEAR_MONTH); //相对路径 String relativePath = "/" + monthStr + "/" + DateUtil.getDayStr(currentDate) + "/"; //绝对路径 String absolutePath = fileUploadFolder + "/" + monthStr + "/" + DateUtil.getDayStr(currentDate) + "/"; String fileNameNonSuffix = getFilenameNonSuffix(fileName); if(fileNameNonSuffix == null) { return null; } String encodeFileName = SHA256Util.getSHA256Str(fileNameNonSuffix + System.currentTimeMillis()); if(StringUtils.isNotBlank(suffix)) { encodeFileName = encodeFileName + "." + suffix; } Long b = uploadFileInput(file, absolutePath, encodeFileName); FileUploadResult dto = new FileUploadResult(); dto.setFileName(fileNameNonSuffix); dto.setFileEncodeName(encodeFileName); dto.setFilePath(relativePath); dto.setFileSize(b); dto.setFileSuffix(suffix); return dto; } /** * MultipartFile 方式保存 * @param file * @return */ public static FileUploadResult uploadMultipartFile(MultipartFile file) { if(file == null || file.isEmpty()) { return null; } String fileName = file.getOriginalFilename(); String suffix = getFileSuffix(fileName); Date currentDate = DateUtil.getNow(); String monthStr = DateUtil.format(currentDate, DateUtil.STR_YEAR_MONTH); //相对路径 String relativePath = "/" + monthStr + "/" + DateUtil.getDayStr(currentDate) + "/"; //绝对路径 String absolutePath = fileUploadFolder + "/" + monthStr + "/" + DateUtil.getDayStr(currentDate) + "/"; String fileNameNonSuffix = getFilenameNonSuffix(fileName); if(fileNameNonSuffix == null) return null; String encodeFileName = SHA256Util.getSHA256Str(fileNameNonSuffix + System.currentTimeMillis()); Long fileSize = file.getSize(); if(StringUtils.isNotBlank(suffix)) { encodeFileName = encodeFileName + "." + suffix; } boolean b = uploadFile(file, absolutePath, encodeFileName); if(!b) return null; FileUploadResult dto = new FileUploadResult(); dto.setFileName(fileNameNonSuffix); dto.setFilePath(encodeFileName); dto.setFilePath(relativePath); dto.setFileSize(fileSize); dto.setFileSuffix(suffix); return dto; } public static void downLoadFile(HttpServletResponse response, String fileName, String filePath, String toFileName) { String absolutePath = fileUploadFolder + filePath; File file = new File(absolutePath , fileName); if(file.exists()) { byte[] buffer = new byte[1024]; FileInputStream fis = null; BufferedInputStream bis = null; try { response.setHeader("Content-Type", "application/octet-stream;charset=utf-8"); // 告诉浏览器输出内容为流 response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(toFileName, "UTF-8")); fis = new FileInputStream(file); bis = new BufferedInputStream(fis); OutputStream os = response.getOutputStream(); int i = bis.read(buffer); while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } }catch (Exception e) { log.error(e.getMessage(), e.getStackTrace()); }finally { if(bis != null) { try { bis.close(); } catch (IOException e) { } } if(fis != null) { try { fis.close(); } catch (IOException e) { } } } }else { } } /** * 上传文件工具类 * @param file * @param path * @param fileNewName 新的文件名 * @return */ public static Long uploadFileInput(File file, String path, String fileNewName) { File targetFile = new File(path, fileNewName); if(!targetFile.getParentFile().exists()){ targetFile.getParentFile().mkdirs(); } try { FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream(targetFile); //FileInputStream fis = new FileInputStream(file); byte[] bytes = new byte[1024 * 4]; int index = 0; long total = 0; while ((index = fis.read(bytes)) != -1) { fos.write(bytes, 0, index); total =+ index; } fis.close(); fos.flush(); fos.close(); return total; } catch (Exception e) { log.error(e.getMessage(), e.getStackTrace()); return 0L; } } /** * 上传文件工具类 * @param multipartFile * @param path * @param fileNewName 新的文件名 * @return */ public static boolean uploadFile(MultipartFile multipartFile, String path, String fileNewName) { File targetFile = new File(path, fileNewName); if(!targetFile.getParentFile().exists()){ targetFile.getParentFile().mkdirs(); } try { multipartFile.transferTo(targetFile); return true; } catch (Exception e) { log.error(e.getMessage(), e.getStackTrace()); return false; } } /** * 获取文件后缀 无后缀文件返回NULL * @param fileName * @return */ public static String getFileSuffix(String fileName) { if (fileName.contains(".")) { String suffix = fileName.substring(fileName.lastIndexOf('.') + 1); return suffix; }else { return null; } } /** * 获取文件名 不带后缀和点号 * @param fileName * @return */ public static String getFilenameNonSuffix(String fileName) { if (fileName.contains(".")) { String filename = fileName.substring(0, fileName.lastIndexOf('.')); return filename; }else { return fileName; } } public static String checkFileEncode(File file) { String charset = "GBK"; byte[] first3Bytes = new byte[3]; BufferedInputStream bis = null; try { boolean checked = false; bis = new BufferedInputStream(new FileInputStream(file)); bis.mark(0); int read = bis.read(first3Bytes, 0, 3); if (read == -1) return charset; if(first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE ) { charset = "UTF-16LE"; checked = true; }else if ( first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF ) { charset = "UTF-16BE"; checked = true; }else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB && first3Bytes[2] == (byte) 0xBF ) { charset = "UTF-8"; checked = true; } bis.reset(); if (!checked) { while ((read = bis.read()) != -1 ) { if ( read >= 0xF0 ) break; if ( 0x80 <= read && read <= 0xBF ) // 单独出现BF以下的,也算是GBK break; if ( 0xC0 <= read && read <= 0xDF ) { read = bis.read(); if ( 0x80 <= read && read <= 0xBF ) // 双字节 (0xC0 - 0xDF) (0x80 - 0xBF),也可能在GBK编码内   continue; else break; } else if ( 0xE0 <= read && read <= 0xEF ) { // 也有可能出错,但是几率较小 read = bis.read(); if ( 0x80 <= read && read <= 0xBF ) { read = bis.read(); if ( 0x80 <= read && read <= 0xBF ) { charset = "UTF-8"; break; } else break; } else { break; } } } } return charset; }catch (Exception e) { return null; }finally { if(bis != null) { try { bis.close(); } catch (IOException e) { } } } } }