Java判断文件是否为图片
前言
在上传图片文件的时候除了需要限制文件的大小,通常还需要对文件类型进行判断。因为用户可能会上传任何东西上来,如果被有心人上传木马到你服务器那就麻烦了。
Java检查文件类型的方法
判断文件后缀名
String extension = "";
int i = fileName.lastIndexOf('.');
if (i > 0) {extension = fileName.substring(i+1);
}
//...
if("jpg".equals(extension)){//your code
}
但是这种方法不太靠谱
判断文件头
在后缀未知,或者后缀被修改的文件,依然通过文件头来判断该文件究竟是什么文件类型。我们可以使用一个文本编辑工具如UltraEdit打开文件(16进制模式下),然后看文件头是什么字符,以下是常见图片类型的文件头字符(16进制)
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
通过MimetypesFileTypeMap来判断
public class ImageCheck {private MimetypesFileTypeMap mtftp;public ImageCheck(){mtftp = new MimetypesFileTypeMap();/* 不添加下面的类型会造成误判 详见:http://stackoverflow.com/questions/4855627/java-mimetypesfiletypemap-always-returning-application-octet-stream-on-android-e*/mtftp.addMimeTypes("image png tif jpg jpeg bmp");}public boolean isImage(File file){String mimetype= mtftp.getContentType(file);String type = mimetype.split("/")[0];return type.equals("image");}}
该方法貌似是基于文件后缀进行判断的,修改文本文件后缀为jpg,也会返回true。
通过ImageIO来判断
try {// 通过ImageReader来解码这个file并返回一个BufferedImage对象// 如果找不到合适的ImageReader则会返回null,我们可以认为这不是图片文件// 或者在解析过程中报错,也返回falseImage image = ImageIO.read(file);return image != null;
} catch(IOException ex) {return false;
}
注意: 该方法适用的图片格式为 bmp/gif/jpg/png
测试
测试不同的方法
public class ImageCheckerTest {private File imageFile;//真正的图片文件 图片private File txt2ImageFile; //将txt后缀改为jpg txtprivate File image2txt;//将图片文件后缀改为txt 图片@Beforepublic void init(){imageFile = new File("D:\\image.jpg");txt2ImageFile = new File("D:\\txt.jpg");image2txt = new File("D:\\image.txt");}@Testpublic void test1(){MimetypesFileTypeMap mtftp = new MimetypesFileTypeMap();mtftp.addMimeTypes("image png tif jpg jpeg bmp");String mimetype = mtftp.getContentType(imageFile);String type = mimetype.split("/")[0];assertTrue(type.equals("image"));mimetype = mtftp.getContentType(txt2ImageFile);type = mimetype.split("/")[0];assertFalse(type.equals("image"));mimetype = mtftp.getContentType(image2txt);type = mimetype.split("/")[0];assertTrue(type.equals("image"));}@Testpublic void test2() throws IOException {String mimetype = Files.probeContentType(imageFile.toPath());String type = mimetype.split("/")[0];assertTrue(type.equals("image"));mimetype = Files.probeContentType(txt2ImageFile.toPath());type = mimetype.split("/")[0];assertFalse(type.equals("image"));mimetype = Files.probeContentType(image2txt.toPath());type = mimetype.split("/")[0];assertTrue(type.equals("image"));}@Testpublic void test3() {FileNameMap fileNameMap = URLConnection.getFileNameMap();String type = fileNameMap.getContentTypeFor(imageFile.getAbsolutePath()).split("/")[0];assertTrue(type.equals("image"));type = fileNameMap.getContentTypeFor(txt2ImageFile.getAbsolutePath()).split("/")[0];assertFalse(type.equals("image"));type = fileNameMap.getContentTypeFor(image2txt.getAbsolutePath()).split("/")[0];assertTrue(type.equals("image"));}@Testpublic void test4() throws IOException {assertTrue(check4(imageFile));assertFalse(check4(txt2ImageFile));assertTrue(check4(image2txt));}public boolean check4(File file){try {Image image = ImageIO.read(file);return image != null;} catch(IOException ex) {return false;}}}
我准备了3个文件,第1个是真正的图片文件,第2个是后缀为jpg的文本文件,第3个为后缀是txt的图片文件
测试结果如下:
只有第4个测试用例成功的。其他的都死在对第2个文件的判断上了,我把对第2个文件的判断代码都删掉,结果又死在对第3个文件的判断上了。
测试不同的图片格式
接下来测试方法4能适用的图片格式:
通过图片转换器将jpg图片转换为下面的格式:
public class ImageCheckerTest {private File path;@Beforepublic void init(){path = new File("D:\\images");}public boolean check4(File file){try {Image image = ImageIO.read(file);return image != null;} catch(IOException ex) {return false;}}@Testpublic void testImageType() {File[] files = path.listFiles();for (File file : files){System.out.println("Check file: " + file.getName() +" : " + check4(file));}}
}
结果如下:
Check file: image.bmp : true
Check file: image.dcx : false
Check file: image.gif : true
Check file: image.ico : false
Check file: image.j2k : false
Check file: image.jp2 : false
Check file: image.jpg : true
Check file: image.pcx : false
Check file: image.png : true
Check file: image.psd : false
Check file: image.tga : false
Check file: image.tif : false
该方法适用的图片格式为:bmp/gif/jpg/png
总结
如果对安全性和图片格式完整性要求高的话建议使用第三方jar包。
Java判断文件是否为图片相关推荐
- Java判断文件是否为图片文件(GIF,PNG,JPG)
查看源代码: 1 /** 2 * 判断文件是否为图片文件(GIF,PNG,JPG) 3 * @param srcFileName 4 * @return 5 */ 6 public static bo ...
- java判断文件是否图片_java怎么判断文件是否是图片
java判断文件是否是图片的方法: 1.通过判断文件后缀名String extension = ""; int i = fileName.lastIndexOf('.'); if ...
- java判断文件夹中的图片是否重复
java判断文件夹中的图片是否重复 直接上代码 package com.example.common; import java.io.File; import java.io.FileInputStr ...
- Java判断文件类型
通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...
- android 判断图片的格式的,android判断文件是否是图片文件的方法
判断一个文件是否是图片文件的方法,采用BitmapFactory去decode然后根据返回的Options参数来确定: public static boolean isImageFile(String ...
- java 判断文件的类型,用java流方式判断文件类型
这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 packag ...
- android判断某文件下是否you_android判断图片类型 判断文件是否为图片文件 - 电脑常识 - 服务器之家...
android判断图片类型 判断文件是否为图片文件 发布时间:2017-03-15 来源:服务器之家 判断文件是否为图片,仅通过后缀名判断很不全面,如果把一个txt文件后缀改成gif都会被认为是图片, ...
- PHP判断文章是否有图片,利用PHP判断文件是否为图片的方法总结
前言 在网页设计中,如果需要图片,我们通常拿到的是一个图片的文件名.仅仅通过文件名是无法判断该文件是否是一个图片文件的.或许有的人以为通过后缀名就可以判断,别忘了文件的后缀名是可以随便改动的.更何况, ...
- php 判断是否文件,利用PHP判断文件是否为图片的方法总结
前言 在网页设计中,如果需要图片,我们通常拿到的是一个图片的文件名.仅仅通过文件名是无法判断该文件是否是一个图片文件的.或许有的人以为通过后缀名就可以判断,别忘了文件的后缀名是可以随便改动的.更何况, ...
- php判断是否是文件_PHP判断文件是否为图片文件的方法总结
近日在做图片处理方面的开发,看着这一片不错的文章,分享给大家.在网页设计中,如果需要图片,我们通常拿到的是一个图片的文件名.仅仅通过文件名是无法判断该文件是否是一个图片文件的.或许有的人以为通过后缀名 ...
最新文章
- 基于HTML5的Google水下搜索
- Python培训教程分享:如何实现pygame的初始化和退出操作?
- java memcached 存储对象_java – 从Memcache中获取低级别数据存储区实体对象时的慢速反序列化...
- JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
- why I need a flow learn note.
- 班扎古鲁白玛的沉默(见与不见)
- ubuntu安装c/c++编译环境
- x86 32位oracle,X86 32位和64位的区别
- 类和对象编程(五):友元函数
- java读取中文_java读写中文文件
- fatal error LNK1120: 1 个无法解析的外部命令 的解决办法
- 从oracle到mysql模型转换的自动化实现
- 对 IIC 总线的理解、调用函数以及常见面试问题
- 论文脚注的冷知识你都知道了么?
- Processing基础---绘制基本图形、颜色
- 嘿嘿,我的读者拿到阿里offer,复盘他的时间轴
- python输入一个字符、如果是大写字母、转换为小写_python语言 输入一个字母 如果它是一个小写英文字母 则把它转换为对应的大写字母输出?...
- 长春初一学生数学补习班哪家好/麦田1对1补习费用
- 用React-Native+Mobx做一个迷你水果商城APP
- HDU 1569 最大点权独立集