package com.jcdm.common.utils.file; import java.io.File; import java.io.IOException; import java.nio.file.Paths; import java.util.Objects; import org.apache.commons.io.FilenameUtils; import org.springframework.web.multipart.MultipartFile; import com.jcdm.common.config.MesConfig; import com.jcdm.common.constant.Constants; import com.jcdm.common.exception.file.FileNameLengthLimitExceededException; import com.jcdm.common.exception.file.FileSizeLimitExceededException; import com.jcdm.common.exception.file.InvalidExtensionException; import com.jcdm.common.utils.DateUtils; import com.jcdm.common.utils.StringUtils; import com.jcdm.common.utils.uuid.Seq; /** * æ–‡ä»¶ä¸Šä¼ å·¥å…·ç±» * * @author jc */ public class FileUploadUtils { /** * é»˜è®¤å¤§å° 50M */ public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; /** * 默认的文件å最大长度 100 */ public static final int DEFAULT_FILE_NAME_LENGTH = 100; /** * é»˜è®¤ä¸Šä¼ çš„åœ°å€ */ private static String defaultBaseDir = MesConfig.getProfile(); public static void setDefaultBaseDir(String defaultBaseDir) { FileUploadUtils.defaultBaseDir = defaultBaseDir; } public static String getDefaultBaseDir() { return defaultBaseDir; } /** * 以默认é…ç½®è¿›è¡Œæ–‡ä»¶ä¸Šä¼ * * @param file ä¸Šä¼ çš„æ–‡ä»¶ * @return 文件å称 * @throws Exception */ public static final String upload(MultipartFile file) throws IOException { try { return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); } catch (Exception e) { throw new IOException(e.getMessage(), e); } } /** * æ ¹æ®æ–‡ä»¶è·¯å¾„ä¸Šä¼ * * @param baseDir 相对应用的基目录 * @param file ä¸Šä¼ çš„æ–‡ä»¶ * @return 文件å称 * @throws IOException */ public static final String upload(String baseDir, MultipartFile file) throws IOException { try { return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); } catch (Exception e) { throw new IOException(e.getMessage(), e); } } /** * æ–‡ä»¶ä¸Šä¼ * * @param baseDir 相对应用的基目录 * @param file ä¸Šä¼ çš„æ–‡ä»¶ * @param allowedExtension ä¸Šä¼ æ–‡ä»¶ç±»åž‹ * @return è¿”å›žä¸Šä¼ æˆåŠŸçš„文件å * @throws FileSizeLimitExceededException å¦‚æžœè¶…å‡ºæœ€å¤§å¤§å° * @throws FileNameLengthLimitExceededException 文件å太长 * @throws IOException 比如读写文件出错时 * @throws InvalidExtensionException æ–‡ä»¶æ ¡éªŒå¼‚å¸¸ */ public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, InvalidExtensionException { int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); } assertAllowed(file, allowedExtension); String fileName = extractFilename(file); String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); file.transferTo(Paths.get(absPath)); return getPathFileName(baseDir, fileName); } /** * ç¼–ç 文件å */ public static final String extractFilename(MultipartFile file) { return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); } public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException { File desc = new File(uploadDir + File.separator + fileName); if (!desc.exists()) { if (!desc.getParentFile().exists()) { desc.getParentFile().mkdirs(); } } return desc; } public static final String getPathFileName(String uploadDir, String fileName) throws IOException { int dirLastIndex = MesConfig.getProfile().length() + 1; String currentDir = StringUtils.substring(uploadDir, dirLastIndex); return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; } /** * 文件大å°æ ¡éªŒ * * @param file ä¸Šä¼ çš„æ–‡ä»¶ * @return * @throws FileSizeLimitExceededException å¦‚æžœè¶…å‡ºæœ€å¤§å¤§å° * @throws InvalidExtensionException */ public static final void assertAllowed(MultipartFile file, String[] allowedExtension) throws FileSizeLimitExceededException, InvalidExtensionException { long size = file.getSize(); if (size > DEFAULT_MAX_SIZE) { throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); } String fileName = file.getOriginalFilename(); String extension = getExtension(file); if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) { if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) { throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, fileName); } else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) { throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, fileName); } else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) { throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, fileName); } else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) { throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, fileName); } else { throw new InvalidExtensionException(allowedExtension, extension, fileName); } } } /** * 判æ–MIME类型是å¦æ˜¯å…许的MIME类型 * * @param extension * @param allowedExtension * @return */ public static final boolean isAllowedExtension(String extension, String[] allowedExtension) { for (String str : allowedExtension) { if (str.equalsIgnoreCase(extension)) { return true; } } return false; } /** * 获å–文件åçš„åŽç¼€ * * @param file 表å•æ–‡ä»¶ * @return åŽç¼€å */ public static final String getExtension(MultipartFile file) { String extension = FilenameUtils.getExtension(file.getOriginalFilename()); if (StringUtils.isEmpty(extension)) { extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); } return extension; } }