java判断是否上传的文件修改后缀
调用:
@ApiOperation("图片文件上传")
public Result<String> uploadPic(@RequestParam("file")MultipartFile file ){
//判断文件后缀名是否被修改
Result<String> originalFile = GetFileTypeUtil.getOriginalFile(file);
if(!originalFile.isSuccess()){
return originalFile;
}
.......
}
代码:
import com.hronline.commons.tools.utils.Result;
import com.hronline.sys.enums.FileType;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public class GetFileTypeUtil {
public static Result<String> getOriginalFile(MultipartFile file){
try {
String suf = "";
//首先判断是不是空的文件
if (!file.isEmpty()) {
//对文文件的全名进行截取然后在后缀名进行删选。
int begin = file.getOriginalFilename().indexOf(".");
int last = file.getOriginalFilename().length();
//获得文件后缀名
suf = file.getOriginalFilename().substring(begin + 1, last);
}else {
return new Result().error("上传文件失败");
}
InputStream inputStream = new ByteArrayInputStream(file.getBytes());
FileType typeByStream = getTypeByStream(inputStream);
if(typeByStream == null){
return new Result().ok("非常用文件");
}
String trueSuf = typeByStream.toString();
boolean contains = trueSuf.toLowerCase().contains(suf.toLowerCase());
//docx有点特殊
if(!contains && !(suf.equals("docx") && trueSuf.toLowerCase().equals("zip"))){
return new Result().error("文件格式已更改");
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return new Result().ok("文件格式正确");
}
/**
* byte数组转换成16进制字符串
*
* @param src
* @return
*/
private static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
/**
* 根据文件流读取图片文件真实类型
*
* @param is
* @return
*/
private static FileType getTypeByStream(InputStream is) {
byte[] b = new byte[4];
try {
is.read(b, 0, b.length);
} catch (IOException e) {
e.printStackTrace();
}
String type = bytesToHexString(b).toUpperCase();
FileType[] fileTypes = FileType.values();
for (FileType types : fileTypes) {
//startsWith() 方法用于检测字符串是否以指定的前缀开始
if (type.startsWith(types.getValue())) {
return types;
}
}
return null;
}
}