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