經過後綴名和MIME-TYPE檢查實現文件類型校驗

前言

文件上傳是一個在開發中很常見的需求場景,一般出於安全考慮,咱們會對上傳的文件進行類型校驗,其中常見的有後綴名校驗,mime-type校驗安全

話很少說,直接上代碼

1.首先定義容許上傳的文件類型白名單工具

private static final String[] suffixWhiteList = {"PNG","JPEG","JPG","GIF"};
private static final String[] mimeTypeWhiteList = {"image/jpeg","image/gif","image/png"};

2.後綴名校驗ui

/**
     * 文件後綴名校驗
     *
     * @param fileName
     *            文件名稱
     * @return
     */
    public static boolean suffixCheck(String fileName) {
        if(fileName == null || "".equals(fileName)){
            return false;
        }
        //從最後一個點以後截取字符串
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        //白名單匹配
        boolean anyMatch = Arrays.stream(suffixWhiteList).anyMatch(x -> x.equalsIgnoreCase(suffix));
        return anyMatch;
    }

3.mime-type校驗,由於須要獲取文件的mimeType,我引入了第三方的jar包(其餘一樣功能的jar包均可以)code

//MIME-TYPE工具包
    compile("net.sf.jmimemagic:jmimemagic:0.1.3")
/**
     * MIMETYPE校驗
     * @return
     */
    public static boolean mimeTypeCheck(MultipartFile uploadFile){
        if (uploadFile.isEmpty()){
            return false;
        }
        //文件名
        String fileName = uploadFile.getOriginalFilename();
        // 獲取文件後綴
        String suffix=fileName.substring(fileName.lastIndexOf("."));
        File picFile = null;
        try {
            // 用uuid做爲文件名,防止生成的臨時文件重複
            picFile = File.createTempFile(UuidUtils.getUuid(), suffix);
            FileUtils.copyInputStreamToFile(uploadFile.getInputStream(),picFile);
            // MultipartFile to File
            MagicMatch match = Magic.getMagicMatch(picFile, false);
            String mimeType = match.getMimeType();
            // 白名單匹配
            boolean anyMatch = Arrays.stream(mimeTypeWhiteList).anyMatch(x -> x.equalsIgnoreCase(mimeType));
            return anyMatch;

        } catch (IOException e) {
            LOGGER.error("生成臨時文件異常",e);
        } catch (Exception  e) {
            LOGGER.error("MIME-TYPE檢查發生異常",e);
        } finally {
            //程序結束時,刪除臨時文件
            if (picFile.exists()){
                picFile.delete();
            }
        }
        return false;
    }
相關文章
相關標籤/搜索