功能介绍
`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项目的文件上传校验。