SpringBoot项目文件上传校验工具类

功能介绍

`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项目文件上传校验(注解版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值