java判断文件是否为图片格式_java读取图片流

java判断文件是否为图片格式_java读取图片流前言Java检查文件类型有几种方法:1.判断文件后缀名Stringextension="";inti=fileName.lastIndexOf(‘.’);if(i>0){extension=fileName.substring(i+1);}//…if("jpg".equal

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

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

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,我们可以认为这不是图片文件
	// 或者在解析过程中报错,也返回false
    Image 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    txt
    private File image2txt;//将图片文件后缀改为txt      图片
    @Before
    public void init(){
        imageFile = new File("D:\\image.jpg");
        txt2ImageFile = new File("D:\\txt.jpg");
        image2txt = new File("D:\\image.txt");
    }


    @Test
    public  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"));
    }

    @Test
    public 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"));
    }

    @Test
    public 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"));
    }

    @Test
    public 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;
    @Before
    public 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;
        }
    }

    @Test
    public 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包。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197085.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java是一种什么语言[通俗易懂]

    Java是一种什么语言[通俗易懂]Java是一种计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。Java编程语言的风格十分接近C++语言。继承了C++语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指針,改以引用取代,同时移除原C++与原来运算符重载,也移除多重继承特性,改用接口取代,增加垃圾回收器功能。在JavaSE1.5版本中引入了泛型编程、类

    2022年7月7日
    28
  • php curl header设置参数[通俗易懂]

    php curl header设置参数[通俗易懂]header中的三种方式$header=array(‘Content-type:application/x-www-form-urlencoded;charset=UTF-8’);$header=array(‘Content-type:application/json;charset=UTF-8’);$header=array(‘Accept:application/json…

    2022年7月27日
    69
  • matlab矩阵怎么进行相加,matlab矩阵如何运算相加

    matlab矩阵怎么进行相加,matlab矩阵如何运算相加matlab矩阵如何运算相加发布时间:2020-12-1114:26:52来源:亿速云阅读:61作者:小新这篇文章主要介绍了matlab矩阵如何运算相加,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。matlab矩阵运算相加的方法:首先需要在matlab命令窗口中创建一个矩阵或数组;然后两矩阵相加需维数一致,在MATLAB中输入代码【A…

    2022年6月25日
    100
  • pycharm注释快捷键无法注释html文本解决方法

    pycharm注释快捷键无法注释html文本解决方法解决pycharm注释快捷键无法注释html文本方法如图修改成值None以后,command+/快捷键,html注释的符号就是<!/–注释内容–>;为Jinja2的时候,注释符号就是{#注释内容#}。修改成None时,Html就没有办法使用Jinja2的快捷输入了…

    2022年6月5日
    75
  • 基于相关滤波的目标跟踪算法_粒子滤波目标跟踪算法优缺点

    基于相关滤波的目标跟踪算法_粒子滤波目标跟踪算法优缺点相关跟踪的核心就是滤波器filters的求解,从MOSSE到KCF再到SRDCF,滤波器的模型越来越复杂,计算速度越来越慢,使得相关滤波在计算速度上的优势越来越不明显。比如较新的算法CFLB和BACF等采用了空间约束来解决边界效应,SRDCF和STRCF等使用空间正则来解决边界效应,这些解决边界效应的措施都让相关跟踪面临实时性的挑战。ADMM把一个大优化问题分成可分布式同时求解的多个子问题,通过对…

    2025年6月25日
    3
  • Android angle_android 界面悬停

    Android angle_android 界面悬停最近在研究android游戏引擎Angle,准备纪录下学习心得。我的目的是用它实现UI,给我开发的安卓应用添加一些迷人的效果。初步研究了一下,只要解决下列问题就可以了:1•汉字显示 2•动态更新纹理,比如从网络下载图片,更新显示 3•简单的动画效果 4•与播放器整合 5•实现一些基本控件,如List(文本、图片),Button,Tab,TextView等 6•与非openg

    2026年1月23日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号