前言
文件上傳是一個(gè)在開(kāi)發(fā)中很常見(jiàn)的需求場(chǎng)景,通常出于安全考慮,我們會(huì)對(duì)上傳的文件進(jìn)行類(lèi)型校驗(yàn),其中常見(jiàn)的有后綴名校驗(yàn),mime-type校驗(yàn)
話(huà)不多說(shuō),直接上代碼
1.首先定義允許上傳的文件類(lèi)型白名單
private static final String[] suffixWhiteList = {"PNG","JPEG","JPG","GIF"};
private static final String[] mimeTypeWhiteList = {"image/jpeg","image/gif","image/png"};
2.后綴名校驗(yàn)
/**
* 文件后綴名校驗(yàn)
*
* @param fileName
* 文件名稱(chēng)
* @return
*/
public static boolean suffixCheck(String fileName) {
if(fileName == null || "".equals(fileName)){
return false;
}
//從最后一個(gè)點(diǎn)之后截取字符串
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
//白名單匹配
boolean anyMatch = Arrays.stream(suffixWhiteList).anyMatch(x -> x.equalsIgnoreCase(suffix));
return anyMatch;
}
3.mime-type校驗(yàn),因?yàn)樾枰@取文件的mimeType,我引入了第三方的jar包(其他同樣功能的jar包都可以)
//MIME-TYPE工具包
compile("net.sf.jmimemagic:jmimemagic:0.1.3")
/**
* MIMETYPE校驗(yàn)
* @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作為文件名下硕,防止生成的臨時(shí)文件重復(fù)
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("生成臨時(shí)文件異常",e);
} catch (Exception e) {
LOGGER.error("MIME-TYPE檢查發(fā)生異常",e);
} finally {
//程序結(jié)束時(shí),刪除臨時(shí)文件
if (picFile.exists()){
picFile.delete();
}
}
return false;
}