直接判断后缀名会有漏洞,比如一个文本文件后缀名改成mp4
所以需要使用字节流的方式判断是否为视频文件
/**
* 根据文件字节流,判断文件是否为mp4视频文件
* @param file 上传的文件
* @throws RuntimeException 如果不是mp4文件则抛出异常
* */
private void isMp4Video(MultipartFile file) throws RuntimeException{
if(!file.isEmpty()){
InputStream in = null;
try {
in = file.getInputStream();
StringBuilder stringBuilder = new StringBuilder();
byte [] bb = new byte[3];
in.read(bb,0,bb.length);
for(int j=0 ; j<bb.length;j++){
int x = bb[j] & 0xFF;
String a = Integer.toHexString(x);
if(a.length()<2){
stringBuilder.append(0);
}
stringBuilder.append(a);
}
if(!stringBuilder.toString().equals("000000")){
String fileName = file.getOriginalFilename();
throw new RuntimeException(fileName+"不是正确的mp4文件!");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(in!=null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注:同一个Inputstream对象只能read()一次。
当第二次read()的时候,会接着从第一次read()的结尾继续读,而不是从头开始读。
所以以上工具类适合单独拿出来封装