文件上傳是一個在開發中很常見的需求場景,一般出於安全考慮,咱們會對上傳的文件進行類型校驗,其中常見的有後綴名校驗,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; }