/**
* 判断文件是否为图片<br>
* <br>
* @param pInput 文件名<br>
* @param pImgeFlag 判断具体文件类型<br>
* @return 检查后的结果<br>
* @throws Exception
*/
public static boolean isPicture(String pInput,
String pImgeFlag) throws Exception{
// 文件名称为空的场合
if(Check.isNull(pInput)){
// 返回不和合法
return false;
}
// 获得文件后缀名
String tmpName = pInput.substring(pInput.lastIndexOf(".") + 1,
pInput.length());
// 声明图片后缀名数组
String imgeArray [][] = {
{"bmp", "0"}, {"dib", "1"}, {"gif", "2"},
{"jfif", "3"}, {"jpe", "4"}, {"jpeg", "5"},
{"jpg", "6"}, {"png", "7"} ,{"tif", "8"},
{"tiff", "9"}, {"ico", "10"}
};
// 遍历名称数组
for(int i = 0; i<imgeArray.length;i++){
// 判断单个类型文件的场合
if(! Check.isNull(pImgeFlag)
&& imgeArray [i][0].equals(tmpName.toLowerCase())
&& imgeArray [i][1].equals(pImgeFlag)){
return true;
}
// 判断符合全部类型的场合
if(Check.isNull(pImgeFlag)
&& imgeArray [i][0].equals(tmpName.toLowerCase())){
return true;
}
}
return false;
}

以下为升级版:转自

一、通常情况下,验证一个文件是否图片,可以通过以下三种方式:

1)、判断文件的扩展名是否是要求的图片扩展名

这种判断是用得比较多的一种方式,不过这种方式非常的不妥,别人稍微的把一个不是图片的文件的扩展名修改为图片的扩展名,就绕开了你的这种校验,如果这上传的文件是shell、PHP或者jsp,那你的网站基本上可以说就在别人的手里面了。

不过这种判断方式也不是完全没有用,我们可以把它放在判断图片的最外层,如果一个文件连扩展名都不是我们所要求的图片扩展名,那就根本不用后面的内容格式检查了,从一定程度上说,对减少服务器的压力还是有一定的帮助,否则所有的文件都等上传完后成后再通过服务器去判断,那会在一定程度上浪费器资源的。

2)、根据文件的前面几个字节,即常说的魔术数字进行判断,不同文件类型的开头几个字节,可以查看我的另外一篇专站介绍:表示不同文件类型的魔术数字

但是这种判断方式也是非常不靠谱的,因为他只能够验证文件的前面几个字节,如此时有人把一个可执行的php文件的扩展名修改为PNG,然后再在前面补上”89 50″两个字节,就又绕开了这种验证方式。

以下是一段通过Java代码获取文件前面两个字节的示例程序:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; public class ImageTypeCheck { 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();
}
public static void main(String[] args) throws IOException {
String imagePath = "c:/favicon.png";
File image = new File(imagePath);
InputStream is = new FileInputStream(image);
byte[] bt = new byte[2];
is.read(bt);
System.out.println(bytesToHexString(bt));
}
}

不过这种判断方式和判断扩展名一样,也不是完全没有用,至少可以在前期在简单的检查,为进入下一步检查做铺垫。

3)、获取图片的宽高属性
如果能够正常的获取到一张图片的宽高属性,那肯定这是一张图片,因为非图片文件我们是获取不到它的宽高属性的,以下是用于获取根据是否可以获取到图片宽高属性来判断这是否一张图片的JAVA代码:

/**
* 通过读取文件并获取其width及height的方式,来判断判断当前文件是否图片,这是一种非常简单的方式。
*
* @param imageFile
* @return
*/
public static boolean isImage(File imageFile) {
if (!imageFile.exists()) {
return false;
}
Image img = null;
try {
img = ImageIO.read(imageFile);
if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {
return false;
}
return true;
} catch (Exception e) {
return false;
} finally {
img = null;
}
}

二、图片文件的安全检查处理
好了,我们终于判断出一个文件是否图片了,可是如果是在一个可以正常浏览的图片文件中加入一些非法的代码呢:

这就是在一张正常的图片末尾增加的一些iframe代码,我曾经尝试过单独打开这张图片,也将这张图片放于网页上打开,虽然这样都不会被执行,但并不代表插入其它的代码也并不会执行,杀毒软件(如AVAST)对这种修改是会报为病毒的。
那我们要如何预防这种东西,即可以正常打开,又具有正确的图片文件扩展名,还可以获取到它的宽高属性?呵,我们这个时候可以对这个图片进地重写,给它增加水印或者对它进行resize操作,这样新生成的图片就不会再包含这样的恶意代码了,以下是一个增加水印的JAVA实现:

/**
* 添加图片水印
*
* @param srcImg 目标图片路径,如:C:\\kutuku.jpg
* @param waterImg 水印图片路径,如:C:\\kutuku.png
* @param x 水印图片距离目标图片左侧的偏移量,如果x<0, 则在正中间
* @param y 水印图片距离目标图片上侧的偏移量,如果y<0, 则在正中间
* @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)
* @throws IOException
*/
public final static void addWaterMark(String srcImg, String waterImg, int x, int y, float alpha) throws IOException {
// 加载目标图片
File file = new File(srcImg);
String ext = srcImg.substring(srcImg.lastIndexOf(".") + 1);
Image image = ImageIO.read(file);
int width = image.getWidth(null);
int height = image.getHeight(null);
// 将目标图片加载到内存。
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufferedImage.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
// 加载水印图片。
Image waterImage = ImageIO.read(new File(waterImg));
int width_1 = waterImage.getWidth(null);
int height_1 = waterImage.getHeight(null);
// 设置水印图片的透明度。
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
// 设置水印图片的位置。
int widthDiff = width - width_1;
int heightDiff = height - height_1;
if (x < 0) {
x = widthDiff / 2;
} else if (x > widthDiff) {
x = widthDiff;
}
if (y < 0) {
y = heightDiff / 2;
} else if (y > heightDiff) {
y = heightDiff;
}
// 将水印图片“画”在原有的图片的制定位置。
g.drawImage(waterImage, x, y, width_1, height_1, null);
// 关闭画笔。
g.dispose();
// 保存目标图片。
ImageIO.write(bufferedImage, ext, file);
}

java判断文件是否为图片的更多相关文章

  1. Java判断文件类型

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

  2. android判断文件是否是图片文件的方法

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

  3. JAVA判断文件的内容类型

    Java 7 新的特性,判断文件的内容类型. Program to demonstrate Java 7 new feature : Determining the file content type ...

  4. java判断文件真实类型

    代码如下: import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; /** * &l ...

  5. Windows C++ 判断文件是否是图片格式的方法。

    一.通过后缀名去判断. bool IsImageByTail(const std::wstring &path) { std::wstring file_exten; size_t pos = ...

  6. Java 判断文件夹、文件是否存在、否则创建文件夹

    1.判断文件是否存在,不存在创建文件 File file=new File("C:\\Users\\QPING\\Desktop\\JavaScript\\2.htm"); if( ...

  7. Java判断文件、文件夹是否存在

    在完成工作室任务的时候多次遇到这个问题,这是一个常用的知识点,记录如下: 1.判断文件是否存在,不存在则创建文件 File file=new File("C:\\2.jpg"); ...

  8. java判断文件或文件夹是否在

    public static void main(String[] args) { File file = new File("G:\\Jeff.txt"); File dir = ...

  9. java判断文件是否存在

    1.判断远程服务器上文件 import java.net.HttpURLConnection; import java.net.URL; public boolean checkRemoteFile( ...

随机推荐

  1. Eureka如何剔除已经宕机的节点

    同一个服务部署了多个实例,在通过网关调用时会随机调用其中一个.但是,当某个服务挂掉之后,依然在注册中心中,依然会随机被调用到,调用时便会超时报错.(主要是开发测试或者演示时需要立即将失效的从注册中心剔 ...

  2. [转帖]Linux - NetworkManager网络管理工具

    Linux - NetworkManager网络管理工具 linux运维菜 发布时间:18-10-3020:32优质原创作者 简介 网络管理器(NetworManager)是检测网络.自动连接网络的程 ...

  3. swagger 爬坑记

    Swagger 的好处不用我多说,但是一不小心可能就被坑……今天下午就被上了一课,废话不多说,直接上代码(图) 实体类: 好像没啥问题,对吧? 但是,在http://localhost:8080/sw ...

  4. 剑指offer52:正则表达式匹配

    1 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符‘.’表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个 ...

  5. 新浪sae对storage的文档进行读写操作

    有的人喜欢将一些数据写在服务器的文件里面,并不喜欢存在mysql里,但新浪sae却不支持对本地文件进行操作. 不过sae拓展了一个storage的服务,可以将一些静态文件放在上面.本文不介绍文件的上传 ...

  6. 利用Python进行数据分析_Pandas_数据结构

    申明:本系列文章是自己在学习<利用Python进行数据分析>这本书的过程中,为了方便后期自己巩固知识而整理. 首先,需要导入pandas库的Series和DataFrame In [21] ...

  7. 模块 os 和 sys

    目录 os 模块 sys 模块 os 模块 os 模块是与操作系统交互的一个接口 方法 详解 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir(&quo ...

  8. CSS定位以及z-index属性(层叠性)的详解(转)

    https://blog.csdn.net/weixin_41342585/article/details/79484879

  9. CI/CD/Jenkins

    Continuous Integration, Continuous Delivery & Deployment (CI/CD) 持续集成.持续部署&持续交付. Jenkins就是一个 ...

  10. 音视频入门-02-RGB拼图

    * 音视频入门文章目录 * 图片 & 像素点 & RGB 平时浏览的图片看不出像素点: 图片放大时,可以看出图片是一个个像素点组成的: 每个像素点的颜色可以用 RGB 表示: RGB ...