JAVA 图片格式检查方法

        最近做图片下载和图片上传时被图片格式给折腾死了,这里总结一下如何验证验证一个文件是否图片以及获取其图片格式的方法,供大家参考!

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

1、判断文件的扩展名是否是要求的图片扩展名
      这种判断是用得比较多的一种方式,不过这种方式非常的不妥,别人稍微的把一个不是图片的文件的扩展名修改为图片的扩展名,就绕开了你的这种校验,如果这上传的文件是shell、php或者jsp,那你的网站基本上可以说就在别人的手里面了。
不过这种判断方式也不是完全没有用,我们可以把它放在判断图片的最外层,如果一个文件连扩展名都不是我们所要求的图片扩展名,那就根本不用后面的内容格式检查了,从一定程度上说,对减少服务器的压力还是有一定的帮助,否则所有的文件都等上传完后成后再通过服务器去判断,那会在一定程度上浪费器资源的。
2、根据文件的前面几个字节,即常说的魔术数字进行判断,不同文件类型的开头几个字节,可以查看我的另外一篇专站介绍:表示不同文件类型的魔术数字。

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

3、使用javax.imageio.ImageIO ,如果能获取到相关联的ImageReader则说明其为图片,并可进一步获取到图片的格式等信息。


上述 1、2 方法的 实现可参考 这篇博客:使用JAVA如何对图片进行格式检查以及安全检查处理,我这里只说一下第三种方法。

这里做测试的图片文件 格式被改为 png,但通过本方法检查发现其格式是 JPEG的,示例代码如下:

package com.ricky.java.common.download.test;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class ImageDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		File file = new File("E:/download_test/pics/1c/1cd5v0uya36wg0rf4fu39dtym.png");
		
		boolean result = isImage(file);
		System.out.println("result="+result);
	    
		getExtension(file);
	}
	
	public static void getExtension(File file) {
		ImageInputStream iis = null;
		try {
			iis = ImageIO.createImageInputStream(file);
			Iterator<ImageReader> iter = ImageIO.getImageReaders(iis); 
			if(iter.hasNext()){
				System.out.println("扩展名:"+iter.next().getFormatName());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(iis!=null){
				try {
					iis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static boolean isImage(File resFile){
		ImageInputStream iis = null;
		try {
			iis = ImageIO.createImageInputStream(resFile);
			Iterator<ImageReader> iter = ImageIO.getImageReaders(iis); 
			if (iter.hasNext()) {//文件不是图片 
			    return true;
			} 
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(iis!=null){
				try {
					iis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return false;
	}
	
}






  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中,可以使用以下方法来校验文件的格式: 1. 使用文件扩展名进行校验:可以通过获取文件的扩展名,然后与预期的文件格式进行比较来进行校验。例如,假设我们要校验一个文件是否为图片格式(.jpg、.png、.gif等),可以使用以下代码: ```java File file = new File("path/to/file.jpg"); String extension = getFileExtension(file); if (extension != null && (extension.equals("jpg") || extension.equals("png") || extension.equals("gif"))) { System.out.println("文件格式正确"); } else { System.out.println("文件格式不正确"); } // 获取文件的扩展名 private static String getFileExtension(File file) { String fileName = file.getName(); int dotIndex = fileName.lastIndexOf("."); if (dotIndex >= 0 && dotIndex < fileName.length() - 1) { return fileName.substring(dotIndex + 1).toLowerCase(); } return null; } ``` 2. 使用文件的魔术数字进行校验:每种文件格式都有一个特定的文件头(也称为魔术数字),可以通过读取文件的前几个字节来判断文件的格式。可以通过比较文件的魔术数字与预期的魔术数字来进行校验。以下是一个示例代码,用于校验一个文件是否为PDF格式: ```java File file = new File("path/to/file.pdf"); byte[] magicNumbers = new byte[]{0x25, 0x50, 0x44, 0x46}; // PDF文件的魔术数字 try (InputStream inputStream = new FileInputStream(file)) { byte[] fileHeader = new byte[magicNumbers.length]; inputStream.read(fileHeader); if (Arrays.equals(fileHeader, magicNumbers)) { System.out.println("文件格式正确"); } else { System.out.println("文件格式不正确"); } } catch (IOException e) { e.printStackTrace(); } ``` 请注意,以上方法仅仅是一种简单的校验方式,不能保证文件的完全正确性。如果需要对文件进行更严格的校验,可能需要使用外部库或者检查文件的内容结构。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值