通過后綴名和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.后綴名校驗

    /**
     * 文件后綴名校驗
     *
     * @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包都可以)

    //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;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM