前言

在上传图片文件的时候除了需要限制文件的大小,通常还需要对文件类型进行判断。因为用户可能会上传任何东西上来,如果被有心人上传木马到你服务器那就麻烦了。

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判断文件是否为图片相关推荐

  1. Java判断文件是否为图片文件(GIF,PNG,JPG)

    查看源代码: 1 /** 2 * 判断文件是否为图片文件(GIF,PNG,JPG) 3 * @param srcFileName 4 * @return 5 */ 6 public static bo ...

  2. java判断文件是否图片_java怎么判断文件是否是图片

    java判断文件是否是图片的方法: 1.通过判断文件后缀名String extension = ""; int i = fileName.lastIndexOf('.'); if ...

  3. java判断文件夹中的图片是否重复

    java判断文件夹中的图片是否重复 直接上代码 package com.example.common; import java.io.File; import java.io.FileInputStr ...

  4. Java判断文件类型

    通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...

  5. android 判断图片的格式的,android判断文件是否是图片文件的方法

    判断一个文件是否是图片文件的方法,采用BitmapFactory去decode然后根据返回的Options参数来确定: public static boolean isImageFile(String ...

  6. java 判断文件的类型,用java流方式判断文件类型

    这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 packag ...

  7. android判断某文件下是否you_android判断图片类型 判断文件是否为图片文件 - 电脑常识 - 服务器之家...

    android判断图片类型 判断文件是否为图片文件 发布时间:2017-03-15 来源:服务器之家 判断文件是否为图片,仅通过后缀名判断很不全面,如果把一个txt文件后缀改成gif都会被认为是图片, ...

  8. PHP判断文章是否有图片,利用PHP判断文件是否为图片的方法总结

    前言 在网页设计中,如果需要图片,我们通常拿到的是一个图片的文件名.仅仅通过文件名是无法判断该文件是否是一个图片文件的.或许有的人以为通过后缀名就可以判断,别忘了文件的后缀名是可以随便改动的.更何况, ...

  9. php 判断是否文件,利用PHP判断文件是否为图片的方法总结

    前言 在网页设计中,如果需要图片,我们通常拿到的是一个图片的文件名.仅仅通过文件名是无法判断该文件是否是一个图片文件的.或许有的人以为通过后缀名就可以判断,别忘了文件的后缀名是可以随便改动的.更何况, ...

  10. php判断是否是文件_PHP判断文件是否为图片文件的方法总结

    近日在做图片处理方面的开发,看着这一片不错的文章,分享给大家.在网页设计中,如果需要图片,我们通常拿到的是一个图片的文件名.仅仅通过文件名是无法判断该文件是否是一个图片文件的.或许有的人以为通过后缀名 ...

最新文章

  1. 基于HTML5的Google水下搜索
  2. Python培训教程分享:如何实现pygame的初始化和退出操作?
  3. java memcached 存储对象_java – 从Memcache中获取低级别数据存储区实体对象时的慢速反序列化...
  4. JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
  5. why I need a flow learn note.
  6. 班扎古鲁白玛的沉默(见与不见)
  7. ubuntu安装c/c++编译环境
  8. x86 32位oracle,X86 32位和64位的区别
  9. 类和对象编程(五):友元函数
  10. java读取中文_java读写中文文件
  11. fatal error LNK1120: 1 个无法解析的外部命令 的解决办法
  12. 从oracle到mysql模型转换的自动化实现
  13. 对 IIC 总线的理解、调用函数以及常见面试问题
  14. 论文脚注的冷知识你都知道了么?
  15. Processing基础---绘制基本图形、颜色
  16. 嘿嘿,我的读者拿到阿里offer,复盘他的时间轴
  17. python输入一个字符、如果是大写字母、转换为小写_python语言 输入一个字母 如果它是一个小写英文字母 则把它转换为对应的大写字母输出?...
  18. 长春初一学生数学补习班哪家好/麦田1对1补习费用
  19. 用React-Native+Mobx做一个迷你水果商城APP
  20. HDU 1569 最大点权独立集

热门文章

  1. DB - 常用SQL积累
  2. 浏览器输入网址回车发生的事情?--
  3. 设计模式(二)--单例模式
  4. Part2-HttpClient官方教程-Chapter5-流利的API
  5. OOP in Javascript
  6. 文件大小转换(b,kb,M,GB/TB)
  7. Spring注解详解(转)
  8. 遍历josn的三种方式
  9. 手机网站的图片轮换教程
  10. 影院平台搭建 - (7)读多写少数据的缓存