diff --git a/hw-modules/hw-file/src/main/java/com/hw/file/service/LocalSysFileServiceImpl.java b/hw-modules/hw-file/src/main/java/com/hw/file/service/LocalSysFileServiceImpl.java index 5fc8f8a..32b7572 100644 --- a/hw-modules/hw-file/src/main/java/com/hw/file/service/LocalSysFileServiceImpl.java +++ b/hw-modules/hw-file/src/main/java/com/hw/file/service/LocalSysFileServiceImpl.java @@ -8,13 +8,12 @@ import com.hw.file.utils.FileUploadUtils; /** * 本地文件存储 - * + * * @author ruoyi */ @Primary @Service -public class LocalSysFileServiceImpl implements ISysFileService -{ +public class LocalSysFileServiceImpl implements ISysFileService { /** * 资源映射路径 前缀 */ @@ -26,7 +25,7 @@ public class LocalSysFileServiceImpl implements ISysFileService */ @Value("${file.domain}") public String domain; - + /** * 上传文件存储在本地的根路径 */ @@ -46,17 +45,34 @@ public class LocalSysFileServiceImpl implements ISysFileService public String shareFilePrefix; + /** + * 默认允许的上传格式 + */ + @Value("${file.defaultAllowedExtension}") + public String[] defaultAllowedExtension; + + /** + * 默认允许的文件名长度 + */ + @Value("${file.defaultFileNameLength}") + public int defaultFileNameLength; + + /** + * 默认允许上传文件的最大大小 + */ + @Value("${file.defaultMaxSize}") + public long defaultMaxSize; + /** * 本地文件上传接口 - * + * * @param file 上传的文件 * @return 访问地址 * @throws Exception */ @Override - public String uploadFile(MultipartFile file) throws Exception - { - String name = FileUploadUtils.upload(localFilePath, file); + public String uploadFile(MultipartFile file) throws Exception { + String name = FileUploadUtils.upload(localFilePath, file, defaultAllowedExtension, defaultFileNameLength, defaultMaxSize); String url = domain + localFilePrefix + name; return url; } @@ -70,9 +86,8 @@ public class LocalSysFileServiceImpl implements ISysFileService * @throws Exception */ @Override - public String uploadFile2SharePath(MultipartFile file) throws Exception - { - String name = FileUploadUtils.upload(shareFilePath, file); + public String uploadFile2SharePath(MultipartFile file) throws Exception { + String name = FileUploadUtils.upload(shareFilePath, file, defaultAllowedExtension, defaultFileNameLength, defaultMaxSize); String url = domain + shareFilePrefix + name; return url; } diff --git a/hw-modules/hw-file/src/main/java/com/hw/file/utils/FileUploadUtils.java b/hw-modules/hw-file/src/main/java/com/hw/file/utils/FileUploadUtils.java index 7a0c717..c6615f8 100644 --- a/hw-modules/hw-file/src/main/java/com/hw/file/utils/FileUploadUtils.java +++ b/hw-modules/hw-file/src/main/java/com/hw/file/utils/FileUploadUtils.java @@ -4,6 +4,7 @@ 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.hw.common.core.exception.file.FileException; @@ -18,11 +19,10 @@ import com.hw.common.core.utils.uuid.Seq; /** * 文件上传工具类 - * + * * @author ruoyi */ -public class FileUploadUtils -{ +public class FileUploadUtils { /** * 默认大小 50M */ @@ -37,22 +37,16 @@ public class FileUploadUtils * 根据文件路径上传 * * @param baseDir 相对应用的基目录 - * @param file 上传的文件 + * @param file 上传的文件 * @return 文件名称 * @throws IOException */ - public static final String upload(String baseDir, MultipartFile file) throws IOException - { - try - { + public static final String upload(String baseDir, MultipartFile file) throws IOException { + try { return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); - } - catch (FileException fe) - { + } catch (FileException fe) { throw new IOException(fe.getDefaultMessage(), fe); - } - catch (Exception e) - { + } catch (Exception e) { throw new IOException(e.getMessage(), e); } } @@ -60,22 +54,20 @@ public class FileUploadUtils /** * 文件上传 * - * @param baseDir 相对应用的基目录 - * @param file 上传的文件 + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 * @param allowedExtension 上传文件类型 * @return 返回上传成功的文件名 - * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileSizeLimitExceededException 如果超出最大大小 * @throws FileNameLengthLimitExceededException 文件名太长 - * @throws IOException 比如读写文件出错时 - * @throws InvalidExtensionException 文件校验异常 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 */ public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, - InvalidExtensionException - { + InvalidExtensionException { int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); - if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) - { + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); } @@ -91,28 +83,23 @@ public class FileUploadUtils /** * 编码文件名 */ - public static final String extractFilename(MultipartFile file) - { + public static final String extractFilename(MultipartFile file) { return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), FileTypeUtils.getExtension(file)); } - private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException - { + private 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()) - { + if (!desc.exists()) { + if (!desc.getParentFile().exists()) { desc.getParentFile().mkdirs(); } } return desc.isAbsolute() ? desc : desc.getAbsoluteFile(); } - private static final String getPathFileName(String fileName) throws IOException - { + private static final String getPathFileName(String fileName) throws IOException { String pathFileName = "/" + fileName; return pathFileName; } @@ -122,43 +109,31 @@ public class FileUploadUtils * * @param file 上传的文件 * @throws FileSizeLimitExceededException 如果超出最大大小 - * @throws InvalidExtensionException 文件校验异常 + * @throws InvalidExtensionException 文件校验异常 */ public static final void assertAllowed(MultipartFile file, String[] allowedExtension) - throws FileSizeLimitExceededException, InvalidExtensionException - { + throws FileSizeLimitExceededException, InvalidExtensionException { long size = file.getSize(); - if (size > DEFAULT_MAX_SIZE) - { + if (size > DEFAULT_MAX_SIZE) { throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); } String fileName = file.getOriginalFilename(); String extension = FileTypeUtils.getExtension(file); - if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) - { - if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) - { + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) { throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, fileName); - } - else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) - { + } else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) { throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, fileName); - } - else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) - { + } else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) { throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, fileName); - } - else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) - { + } else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) { throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, fileName); - } - else - { + } else { throw new InvalidExtensionException(allowedExtension, extension, fileName); } } @@ -167,19 +142,103 @@ public class FileUploadUtils /** * 判断MIME类型是否是允许的MIME类型 * - * @param extension 上传文件类型 + * @param extension 上传文件类型 * @param allowedExtension 允许上传文件类型 * @return true/false */ - public static final boolean isAllowedExtension(String extension, String[] allowedExtension) - { - for (String str : allowedExtension) - { - if (str.equalsIgnoreCase(extension)) - { + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) { + for (String str : allowedExtension) { + if (str.equalsIgnoreCase(extension)) { return true; } } return false; } -} \ No newline at end of file + + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file, + String[] defaultAllowedExtension, int defaultFileNameLength, int defaultMaxSize) throws IOException { + try { + return upload(baseDir, file, defaultAllowedExtension,defaultFileNameLength, defaultMaxSize); + } catch (FileException fe) { + throw new IOException(fe.getDefaultMessage(), fe); + } 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, + int defaultFileNameLength,long defaultMaxSize) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException { + int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNamelength > defaultFileNameLength) { + throw new FileNameLengthLimitExceededException(defaultFileNameLength); + } + + assertAllowed(file, allowedExtension,defaultMaxSize); + + String fileName = extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(fileName); + } + + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension,long defaultMaxSize) + throws FileSizeLimitExceededException, InvalidExtensionException { + long size = file.getSize(); + if (size > defaultMaxSize) { + throw new FileSizeLimitExceededException(defaultMaxSize / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = FileTypeUtils.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); + } + } + } + +}