功能介绍
`FileValidationUtils`是一个工具类,主要用于验证上传的文件。以下是其主要功能和特点:
1. 文件类型验证:`FileValidationUtils`类中定义了一个`MIME_TYPE_MAP`,这个映射表包含了允许上传的文件类型和对应的MIME类型。在`validateFile`方法中,会检查上传的文件的MIME类型是否在这个映射表中,如果不在,就抛出异常。
2. 文件扩展名和MIME类型匹配验证:`validateFile`方法会获取上传的文件的扩展名,并在`MIME_TYPE_MAP`中查找这个扩展名对应的MIME类型。然后,它会检查这个MIME类型是否和文件的实际MIME类型匹配,如果不匹配,就抛出异常。
3. 文件内容验证:`validateFile`方法会读取上传的文件的前几个字节,然后使用`FileMagic`类来判断文件的类型。然后,它会检查这个文件类型是否和文件的扩展名匹配,如果不匹配,就抛出异常。
4. 异常处理:如果在验证过程中发现任何问题,`validateFile`方法会抛出一个异常。这个异常可以在调用`validateFile`方法的地方被捕获,并进行相应的错误处理。
使用了Spring的`MultipartFile`类来处理上传的文件,在设计和实现上,我都遵循了Java的最佳实践,包括使用常量来定义允许的文件类型,使用映射表来查找文件类型,使用异常来处理错误等。
FileValidationUtils代码
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;import org.apache.poi.poifs.filesystem.FileMagic;
import org.springframework.web.multipart.MultipartFile;public class FileValidationUtils {private static final Map<String, String> MIME_TYPE_MAP = new HashMap<>();public static final IllegalArgumentException INVALID_FILE_SIGNATURE = new IllegalArgumentException("Invalid file signature");static {MIME_TYPE_MAP.put("png", "image/png");MIME_TYPE_MAP.put("jpeg", "image/jpeg");MIME_TYPE_MAP.put("jpg", "image/jpeg");MIME_TYPE_MAP.put("pdf", "application/pdf");MIME_TYPE_MAP.put("doc", "application/msword");MIME_TYPE_MAP.put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");MIME_TYPE_MAP.put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");}public static void validateFile(MultipartFile file) {String contentType = file.getContentType();if (!MIME_TYPE_MAP.containsValue(contentType)) {throw new IllegalArgumentException("Invalid content type");}String extension = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);String expectedMimeType = MIME_TYPE_MAP.get(extension);if (!expectedMimeType.equals(contentType)) {throw new IllegalArgumentException("Mimetype does not match file extension");}FileMagic fileMagic;try (InputStream is = new BufferedInputStream(file.getInputStream())) {fileMagic = FileMagic.valueOf(is);} catch (IOException e) {throw new IllegalArgumentException("Invalid file");}switch (fileMagic) {case OOXML:if (!Arrays.asList("docx", "xlsx").contains(extension)) {throw INVALID_FILE_SIGNATURE;}break;case OLE2:if (!"doc".equals(extension)) {throw INVALID_FILE_SIGNATURE;}break;case JPEG:if (!Arrays.asList("jpg", "jpeg").contains(extension)) {throw INVALID_FILE_SIGNATURE;}break;case PNG:if (!"png".equals(extension)) {throw INVALID_FILE_SIGNATURE;}break;case PDF:if (!"pdf".equals(extension)) {throw INVALID_FILE_SIGNATURE;}break;default:throw new IllegalArgumentException("Unsupported file type");}}
}
推荐阅读下面文章,通过注解来使用文件校验工具类,统一处理SpringBoot项目的文件上传校验。
SpringBoot项目文件上传校验(注解版)