java通过文件头来判断文件类型

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map.Entry;

/**
 * @Description 根据的文件头来判断文件类型
 * @author LJ
 * @Version v1.0
 */
public class GetFileTypeByHead {
    public static void main(String[] args) throws Exception {
        String fileType = getFileType("E:\\Vdsfdfadsafsf.docx");
        System.out.println(fileType);
    }

    // 缓存文件头信息-文件头信息
    public static final HashMap<String, String> mFileTypes = new HashMap<String, String>();

    static {
        // images
        mFileTypes.put("FFD8FF", "jpg");
        mFileTypes.put("89504E47", "png");
        mFileTypes.put("47494638", "gif");
        mFileTypes.put("49492A00", "tif");
        mFileTypes.put("424D", "bmp");
        //
        mFileTypes.put("41433130", "dwg"); // CAD
        mFileTypes.put("38425053", "psd");
        mFileTypes.put("7B5C727466", "rtf"); // 日记本
        mFileTypes.put("3C3F786D6C", "xml");
        mFileTypes.put("68746D6C3E", "html");
        mFileTypes.put("44656C69766572792D646174653A", "eml"); // 邮件
        mFileTypes.put("D0CF11E0", "doc");
        mFileTypes.put("5374616E64617264204A", "mdb");
        mFileTypes.put("252150532D41646F6265", "ps");
        mFileTypes.put("255044462D312E", "pdf");
        mFileTypes.put("504B03040A00000000008", "docx");
        mFileTypes.put("504B0304", "zip");// zip 压缩文件
        mFileTypes.put("52617221", "rar");
        mFileTypes.put("57415645", "wav");
        mFileTypes.put("41564920", "avi");
        mFileTypes.put("2E524D46", "rm");
        mFileTypes.put("000001BA", "mpg");
        mFileTypes.put("000001B3", "mpg");
        mFileTypes.put("6D6F6F76", "mov");
        mFileTypes.put("3026B2758E66CF11", "asf");
        mFileTypes.put("4D546864", "mid");
        mFileTypes.put("1F8B08", "gz");
    }

    /**
     * 根据文件路径获取文件类型
     *
     * @param filePath
     *            文件路径
     * @return 文件类型
     */
    public static String getFileType(String filePath) {
        String value = getFileHeader(filePath);
        String result = "";
        for (Entry<String, String> entry : mFileTypes.entrySet()) {
            if (value.startsWith(entry.getKey())) {
                result = entry.getValue();
            }
        }
        return result;
    }

    /**
     * 根据文件路径获取文件头信息
     *
     * @param filePath
     *            文件路径
     * @return 文件头信息
     */
    public static String getFileHeader(String filePath) {
        FileInputStream is = null;
        String value = "";
        try {
            is = new FileInputStream(filePath);
            byte[] b = new byte[20];
            is.read(b, 0, b.length);
            value = bytesToHexString(b);
        } catch (Exception e) {
        } finally {
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                }
            }
        }
        return value;
    }

    /**
     * 将要读取文件头信息的文件的byte数组转换成string类型表示
     *
     * @param src
     *            要读取文件头信息的文件的byte数组
     * @return 文件头十六进制信息
     */
    private static String bytesToHexString(byte[] src) {
        StringBuilder builder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        String hv;
        for (int i = 0; i < src.length; i++) {
            // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
            hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
            if (hv.length() < 2) {
                builder.append(0);
            }
            builder.append(hv);
        }
        System.out.println("HexString: " + builder.toString());
        return builder.toString();
    }
}
时间: 2024-11-05 16:31:58

java通过文件头来判断文件类型的相关文章

根据文件头检测文件类型

文件签名一般都在文件的头部,如果你用十六进制方式查看文件,你就可以看到文件的一些签名信息.如用uestudio以十六进制方式查看zip格式的文件,其文件内容头部有50 4B 03 04这样的十六进制信息.同理jpg文件状况有FF D8 FF E0 xx xx 4A 46这样的十六进制信息,其实这此十六进制都是表示一些特殊字条. php怎么样验证文件类型?先来看一个简单的方法: function checkFileType($fileName){ $file = fopen($fileName,

利用文件头判断文件类型

上传文件时经常需要做文件类型判断,例如图片.文档等,普通做法是直接判断文件后缀名,而文艺青年为了防止各种攻击同时也会加上使用文件头信息判断文件类型. 原理很简单:用文件头判断,直接读取文件的前2个字节即可. 1 public class FileUtil { 2 /** 3 * byte数组转换成16进制字符串 4 * 5 * @param src 6 * @return 7 */ 8 private static String bytesToHexString(byte[] src) { 9

【转】python通过文件头判断文件类型

刚刚看到一个好玩的程序,拉过来.原文地址:https://www.ttlsa.com/python/determine-file-type-by-the-file-header/ 侵权删. ==============================分隔线============================== 对于提供上传的服务器,需要对上传的文件进行过滤,否则各种webshell,暴库. import struct # 支持文件类型 # 用16进制字符串的目的是可以知道文件头是多少字节

Java如何获取Content-Type的文件类型Mime Type

在Http请求中,有时需要知道Content-Type类型,尤其是上传文件时,更为重要,虽然有些办法可以解决,但都不太准确或者繁琐,索性我发现一个开源的类库能够解决相对完美的解决这个问题,它就是jMimeMagic. jMimeMagic是一个用来检测文件或者数据流的 MIME 类型的 Java 类库. 最新版本是V 0.1.2.需要jar包:commons-logging-1.0.x.jar,log4j-1.2.x.jar 下载地址:点击打开链接 它的用法很简单,如下: File file =

Java怎样获取Content-Type的文件类型Mime Type

在Http请求中.有时须要知道Content-Type类型,尤其是上传文件时.更为重要.尽管有些办法可以解决,但都不太准确或者繁琐,索性我发现一个开源的类库可以解决相对完美的解决问题,它就是jMimeMagic. jMimeMagic是一个用来检測文件或者数据流的 MIME 类型的 Java 类库. 最新版本号是V 0.1.2. 须要jar包:commons-logging-1.0.x.jar,log4j-1.2.x.jar 下载地址:点击打开链接 它的使用方法非常easy,例如以下: File

为python添加magic进行文件类型识别

最近想看看cuckoo里的文件识别功能是怎样实现的,翻了cuckoo源码,发现其对文件格式的判断代码如下: def _get_filetype(self, data): """Gets filetype, uses libmagic if available. @param data: data to be analyzed. @return: file type or None. """ if not HAVE_MAGIC: return No

Python判断上传文件类型

在开发上传服务时,经常需要对上传的文件进行过滤. 本文为大家提供了python通过文件头判断文件类型的方法,非常实用. 代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 import struct  # 支持文件类型  # 用16进制字符串的目的是可以知道文件头是多少字节  # 各种文件头的长度不一样,少半2字符,长则8字

根据文件头数据判断文件类型

现有一文件,其扩展名未知或标记错误.假设它是一个正常的.非空的文件,且将扩展名更正后可以正常使用,那么,如何判断它是哪种类型的文件?在后缀未知,或者后缀被修改的文件,依然通过文件头来判断该文件究竟是什么文件类型.我们可以使用一个文本编辑工具如UltraEdit打开文件(16进制模式下),然后看文件头是什么字符,以下是常见文件类型的文件头字符(16进制),希望对你有帮助:JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47 GIF (gif),文件头:47494

子界类型、集合类型、记录类型、文件类型

子界类型 如果我们定义一个变量i为integer类型,那么i的值在微型机系统的pascal中,使用2字节的定义表示法,取值范围为-32768-32767.而事实上,每个程序中所用的变量的值都有一个确定的范围. 例如,人的年龄一般不超过150,一个班级的学生不超过100人,一年中的月数不超过12,一月中的天数不超过31,等等. 如果我们能在程序中对所用的变量的值域作具体规定的话,就便于检查出那些不合法的数据,这就能更好地保证程序运行的正确性.而且在一定程度上还会节省内存空间. 子界类型就很好解决如