文章目录
前言
判断上传的是否是图片
通过后缀名进行判断
通过文件头
通过ImageIO判断
图片文件的安全检查处理
给图片加水印
前言
在web开发中,肯定会有一些图片上传的功能,如果仅仅是通过页面端进行控制是远远不够的,完全可以直接调用后台的接口,将一些病毒文件上传到服务器,如果不进行校验,后果不堪设想!
判断上传的是否是图片
通过后缀名进行判断
这层校验应该说是最基本的校验了,看下文件的后缀名是否符合要求的格式。
String fileType= "";
int i = fileName.lastIndexOf('.');
if (i > 0) {
fileType= fileName.substring(i+1);
}
//...
if("jpg".equals(fileType) || "png".equals(fileType) ....){
//your code
}
这种非常的不靠谱,完全可以修改文件的后缀名绕过检验。
通过文件头
根据文件的前面几个字节,即常说的魔术数字进行判断,不同文件类型的开头几个字节
// 获得文件头部字符串
public 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();
}
不同文件的头魔术数字
private static void getAllFileType()
{
FILE_TYPE_MAP.put("jpg", "FFD8FF"); //JPEG
FILE_TYPE_MAP.put("png", "89504E47"); //PNG
FILE_TYPE_MAP.put("gif", "47494638"); //GIF
FILE_TYPE_MAP.put("tif", "49492A00"); //TIFF
FILE_TYPE_MAP.put("bmp", "424D"); //Windows Bitmap
FILE_TYPE_MAP.put("dwg", "41433130"); //CAD
FILE_TYPE_MAP.put("html", "68746D6C3E"); //HTML
FILE_TYPE_MAP.put("rtf", "7B5C727466"); //Rich Text Format
FILE_TYPE_MAP.put("xml", "3C3F786D6C");
FILE_TYPE_MAP.put("zip", "504B0304"