精华内容
下载资源
问答
  • java判断文件类型

    万次阅读 2019-05-28 16:10:59
    判断文件类型 在上传文件,判断文件类型的时候,往往会通过后缀名和头部信息判断,前者大大不靠谱,后者个别类型的文件不太好判断。这里推荐apache的一款tika,可以做文件判断还可以更强大的做内容解析。一下写出两...

    判断文件类型

    在上传文件,判断文件类型的时候,往往会通过后缀名和头部信息判断,前者大大不靠谱,后者个别类型的文件不太好判断。这里推荐apache的一款tika,可以做文件判断还可以更强大的做内容解析。一下写出两种方法判断,一个基于头部信息,一个基于tika.

    一:根据头部信息

    public class CheckFileType {
    
        private static Trace logger = Trace.getTrace(CheckFileType.class);
        // 缓存文件头信息-文件头信息
        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("D0CF11E0", "xls");//excel2003版本文件
            mFileTypes.put("5374616E64617264204A", "mdb");
            mFileTypes.put("252150532D41646F6265", "ps");
            mFileTypes.put("255044462D312E", "pdf");
            mFileTypes.put("504B0304", "docx");
            mFileTypes.put("504B0304", "xlsx");//excel2007以上版本文件
            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");
        }
    
        /**
         * @return 文件头信息
         * @author liang.pan
         * <p>
         * 方法描述:根据输入流获取文件头信息
         */
        public static String getFileType(InputStream inputStream) {
            return mFileTypes.get(getFileHeader(inputStream));
        }
    
        /**
         * @return 文件头信息
         * @author liang.pan
         * <p>
         * 方法描述:根据输入流获取文件头信息
         */
        public static String getFileHeader(InputStream inputStream) {
            InputStream is = null;
            String value = null;
            try {
                is = inputStream;
                byte[] b = new byte[4];
                /*
                 * int read() 从此输入流中读取一个数据字节。int read(byte[] b) 从此输入流中将最多 b.length
                 * 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len)
                 * 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
                 */
                is.read(b, 0, b.length);
                value = bytesToHexString(b);
            } catch (Exception e) {
            } finally {
                if (null != is) {
                    try {
                        is.close();
                    } catch (IOException e) {
                    }
                }
            }
            logger.info(">>>>>文件的头部信息:" + value);
            if (StringUtils.startsWith(value, "FFD8FF")) {
                value = value.substring(0, 6);
            }
            return value;
        }
    
        /**
         * @param src 要读取文件头信息的文件的byte数组
         * @return 文件头信息
         * @author liang.pan
         * <p>
         * 方法描述:将要读取文件头信息的文件的byte数组转换成string类型表示
         */
        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);
            }
            return builder.toString();
        }
    
    }

    二:tika

    引入依赖
    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-core</artifactId>
        <version>1.20</version>
    </dependency>
    
    public class TikaToolKit {
    
        /**
         * 获取类型
         * @param file
         * @return
         * @throws IOException
         * @throws TikaException
         * @throws SAXException
         */
        public static String getMimeType(File file) {
            if (file.isDirectory()) {
                return "the target is a directory";
            }
    
            AutoDetectParser parser = new AutoDetectParser();
            parser.setParsers(new HashMap<MediaType, Parser>());
            Metadata metadata = new Metadata();
            metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName());
            try (InputStream stream = new FileInputStream(file)) {
                parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
            }catch (Exception e){
                throw new RuntimeException();
            }
            return metadata.get(HttpHeaders.CONTENT_TYPE);
        }
    
        /**
         * 判断是否是图片
         * @param file
         * @return
         * @throws TikaException
         * @throws IOException
         * @throws SAXException
         */
        public static boolean isImage(File file){
            String type = getMimeType(file);
            System.out.println(type);
            Pattern p = Pattern.compile("image/.*");
            Matcher m = p.matcher(type);
            return m.matches();
        }
    }

    常见文件类型

    MimeType    文件类型
    application/msword    word(.doc)
    application/vnd.ms-powerpoint    powerpoint(.ppt)
    application/vnd.ms-excel    excel(.xls)
    application/vnd.openxmlformats-officedocument.wordprocessingml.document    word(.docx)
    application/vnd.openxmlformats-officedocument.presentationml.presentation    powerpoint(.pptx)
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet    excel(.xlsx)
    application/x-rar-compressed    rar
    application/zip    zip
    application/pdf    pdf
    video/*    视频文件
    image/*    图片文件
    text/plain    纯文本
    text/css    css文件
    text/html    html文件
    text/x-java-source    java源代码
    text/x-csrc    c源代码
    text/x-c++src    c++源代码
     

    展开全文
  • Java判断文件类型

    千次阅读 2017-07-11 16:07:20
    通常,在WEB系统中,上传文件时都需要做文件类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等。 2. 通过读取文件,获取文件的Content-type来判断。 3. 通过读取文件流,根据文件流中...
      通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 
    

    1. 通过后缀名,如exe,jpg,bmp,rar,zip等等。

    2. 通过读取文件,获取文件的Content-type来判断。

    3. 通过读取文件流,根据文件流中特定的一些字节标识来区分不同类型的文件。

    4. 若是图片,则通过缩放来判断,可以缩放的为图片,不可以的则不是。

    然而,在安全性较高的业务场景中,1,2两种方法的校验会被轻易绕过。

    1. 伪造后缀名,如图片的,非常容易修改。

    2. 伪造文件的Content-type,这个稍微复杂点,为了直观,截图如下:

     

     

    3.较安全,但是要读取文件,并有16进制转换等操作,性能稍差,但能满足一定条件下对安全的要求,所以建议使用。

      但是文件头的信息也可以伪造,截图如下,对于图片可以采用图片缩放或者获取图片宽高的方法避免伪造头信息漏洞。

     

                                                          被伪装成gif的恶意图片文件

    对应的Java代码如下:

     

    1. package apistudy;    
    2.     
    3. import java.awt.image.BufferedImage;  
    4. import java.io.File;  
    5. import java.io.FileInputStream;  
    6. import java.io.FileNotFoundException;  
    7. import java.io.IOException;  
    8. import java.io.InputStream;  
    9. import java.util.HashMap;  
    10. import java.util.Iterator;  
    11. import java.util.Map;  
    12. import java.util.Map.Entry;  
    13. import javax.imageio.ImageIO;  
    14. import javax.imageio.ImageReader;  
    15. import javax.imageio.stream.ImageInputStream;  
    16.     
    17. public class FileTypeTest    
    18. {    
    19.     public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();    
    20.         
    21.     private FileTypeTest(){}    
    22.     static{    
    23.         getAllFileType();  //初始化文件类型信息    
    24.     }    
    25.         
    26.     /**  
    27.      * Created on 2010-7-1   
    28.      * <p>Discription:[getAllFileType,常见文件头信息]</p>  
    29.      * @author:[shixing_11@sina.com]  
    30.      */    
    31.     private static void getAllFileType()    
    32.     {    
    33.         FILE_TYPE_MAP.put("jpg""FFD8FF"); //JPEG (jpg)    
    34.         FILE_TYPE_MAP.put("png""89504E47");  //PNG (png)    
    35.         FILE_TYPE_MAP.put("gif""47494638");  //GIF (gif)    
    36.         FILE_TYPE_MAP.put("tif""49492A00");  //TIFF (tif)    
    37.         FILE_TYPE_MAP.put("bmp""424D"); //Windows Bitmap (bmp)    
    38.         FILE_TYPE_MAP.put("dwg""41433130"); //CAD (dwg)    
    39.         FILE_TYPE_MAP.put("html""68746D6C3E");  //HTML (html)    
    40.         FILE_TYPE_MAP.put("rtf""7B5C727466");  //Rich Text Format (rtf)    
    41.         FILE_TYPE_MAP.put("xml""3C3F786D6C");    
    42.         FILE_TYPE_MAP.put("zip""504B0304");    
    43.         FILE_TYPE_MAP.put("rar""52617221");    
    44.         FILE_TYPE_MAP.put("psd""38425053");  //Photoshop (psd)    
    45.         FILE_TYPE_MAP.put("eml""44656C69766572792D646174653A");  //Email [thorough only] (eml)    
    46.         FILE_TYPE_MAP.put("dbx""CFAD12FEC5FD746F");  //Outlook Express (dbx)    
    47.         FILE_TYPE_MAP.put("pst""2142444E");  //Outlook (pst)    
    48.         FILE_TYPE_MAP.put("xls""D0CF11E0");  //MS Word    
    49.         FILE_TYPE_MAP.put("doc""D0CF11E0");  //MS Excel 注意:word 和 excel的文件头一样    
    50.         FILE_TYPE_MAP.put("mdb""5374616E64617264204A");  //MS Access (mdb)    
    51.         FILE_TYPE_MAP.put("wpd""FF575043"); //WordPerfect (wpd)     
    52.         FILE_TYPE_MAP.put("eps""252150532D41646F6265");    
    53.         FILE_TYPE_MAP.put("ps""252150532D41646F6265");    
    54.         FILE_TYPE_MAP.put("pdf""255044462D312E");  //Adobe Acrobat (pdf)    
    55.         FILE_TYPE_MAP.put("qdf""AC9EBD8F");  //Quicken (qdf)    
    56.         FILE_TYPE_MAP.put("pwl""E3828596");  //Windows Password (pwl)    
    57.         FILE_TYPE_MAP.put("wav""57415645");  //Wave (wav)    
    58.         FILE_TYPE_MAP.put("avi""41564920");    
    59.         FILE_TYPE_MAP.put("ram""2E7261FD");  //Real Audio (ram)    
    60.         FILE_TYPE_MAP.put("rm""2E524D46");  //Real Media (rm)    
    61.         FILE_TYPE_MAP.put("mpg""000001BA");  //    
    62.         FILE_TYPE_MAP.put("mov""6D6F6F76");  //Quicktime (mov)    
    63.         FILE_TYPE_MAP.put("asf""3026B2758E66CF11"); //Windows Media (asf)    
    64.         FILE_TYPE_MAP.put("mid""4D546864");  //MIDI (mid)    
    65.     }    
    66.     
    67.     public static void main(String[] args) throws Exception    
    68.     {    
    69.         File f = new File("c://aaa.gif");    
    70.         if (f.exists())    
    71.         {    
    72.             String filetype1 = getImageFileType(f);    
    73.             System.out.println(filetype1);    
    74.             String filetype2 = getFileByFile(f);    
    75.             System.out.println(filetype2);    
    76.         }    
    77.     }    
    78.     
    79.     /**  
    80.      * Created on 2010-7-1   
    81.      * <p>Discription:[getImageFileType,获取图片文件实际类型,若不是图片则返回null]</p>  
    82.      * @param File  
    83.      * @return fileType  
    84.      * @author:[shixing_11@sina.com]  
    85.      */    
    86.     public final static String getImageFileType(File f)    
    87.     {    
    88.         if (isImage(f))  
    89.         {  
    90.             try  
    91.             {  
    92.                 ImageInputStream iis = ImageIO.createImageInputStream(f);  
    93.                 Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);  
    94.                 if (!iter.hasNext())  
    95.                 {  
    96.                     return null;  
    97.                 }  
    98.                 ImageReader reader = iter.next();  
    99.                 iis.close();  
    100.                 return reader.getFormatName();  
    101.             }  
    102.             catch (IOException e)  
    103.             {  
    104.                 return null;  
    105.             }  
    106.             catch (Exception e)  
    107.             {  
    108.                 return null;  
    109.             }  
    110.         }  
    111.         return null;  
    112.     }    
    113.     
    114.     /**  
    115.      * Created on 2010-7-1   
    116.      * <p>Discription:[getFileByFile,获取文件类型,包括图片,若格式不是已配置的,则返回null]</p>  
    117.      * @param file  
    118.      * @return fileType  
    119.      * @author:[shixing_11@sina.com]  
    120.      */    
    121.     public final static String getFileByFile(File file)    
    122.     {    
    123.         String filetype = null;    
    124.         byte[] b = new byte[50];    
    125.         try    
    126.         {    
    127.             InputStream is = new FileInputStream(file);    
    128.             is.read(b);    
    129.             filetype = getFileTypeByStream(b);    
    130.             is.close();    
    131.         }    
    132.         catch (FileNotFoundException e)    
    133.         {    
    134.             e.printStackTrace();    
    135.         }    
    136.         catch (IOException e)    
    137.         {    
    138.             e.printStackTrace();    
    139.         }    
    140.         return filetype;    
    141.     }    
    142.         
    143.     /**  
    144.      * Created on 2010-7-1   
    145.      * <p>Discription:[getFileTypeByStream]</p>  
    146.      * @param b  
    147.      * @return fileType  
    148.      * @author:[shixing_11@sina.com]  
    149.      */    
    150.     public final static String getFileTypeByStream(byte[] b)    
    151.     {    
    152.         String filetypeHex = String.valueOf(getFileHexString(b));    
    153.         Iterator<Entry<String, String>> entryiterator = FILE_TYPE_MAP.entrySet().iterator();    
    154.         while (entryiterator.hasNext()) {    
    155.             Entry<String,String> entry =  entryiterator.next();    
    156.             String fileTypeHexValue = entry.getValue();    
    157.             if (filetypeHex.toUpperCase().startsWith(fileTypeHexValue)) {    
    158.                 return entry.getKey();    
    159.             }    
    160.         }    
    161.         return null;    
    162.     }    
    163.         
    164.     /** 
    165.      * Created on 2010-7-2  
    166.      * <p>Discription:[isImage,判断文件是否为图片]</p> 
    167.      * @param file 
    168.      * @return true 是 | false 否 
    169.      * @author:[shixing_11@sina.com] 
    170.      */  
    171.     public static final boolean isImage(File file){  
    172.         boolean flag = false;  
    173.         try  
    174.         {  
    175.             BufferedImage bufreader = ImageIO.read(file);  
    176.             int width = bufreader.getWidth();  
    177.             int height = bufreader.getHeight();  
    178.             if(width==0 || height==0){  
    179.                 flag = false;  
    180.             }else {  
    181.                 flag = true;  
    182.             }  
    183.         }  
    184.         catch (IOException e)  
    185.         {  
    186.             flag = false;  
    187.         }catch (Exception e) {  
    188.             flag = false;  
    189.         }  
    190.         return flag;  
    191.     }  
    192.       
    193.     /**  
    194.      * Created on 2010-7-1   
    195.      * <p>Discription:[getFileHexString]</p>  
    196.      * @param b  
    197.      * @return fileTypeHex  
    198.      * @author:[shixing_11@sina.com]  
    199.      */    
    200.     public final static String getFileHexString(byte[] b)    
    201.     {    
    202.         StringBuilder stringBuilder = new StringBuilder();    
    203.         if (b == null || b.length <= 0)    
    204.         {    
    205.             return null;    
    206.         }    
    207.         for (int i = 0; i < b.length; i++)    
    208.         {    
    209.             int v = b[i] & 0xFF;    
    210.             String hv = Integer.toHexString(v);    
    211.             if (hv.length() < 2)    
    212.             {    
    213.                 stringBuilder.append(0);    
    214.             }    
    215.             stringBuilder.append(hv);    
    216.         }    
    217.         return stringBuilder.toString();    
    218.     }    
    219. }  
     

     

    这样,不管是传入的文件有后缀名,还是无后缀名,或者修改了后缀名,真正获取到的才是该文件的实际类型,这样避免了一些想通过修改后缀名或者Content-type信息来攻击的因素。但是性能与安全永远是无法同时完美的,安全的同时付出了读取文件的代价。本人建议可采用后缀名与读取文件的方式结合校验,毕竟攻击是少数,后缀名的校验能排除大多数用户,在后缀名获取不到时再通过获取文件真实类型校验,这样来适当提高性能。


    原文出处:

    [1] shixing_11, Java判断文件类型 ,http://blog.csdn.net/shixing_11/article/details/5708145

    展开全文
  • JAVA判断文件的真实类型

    千次阅读 2018-07-03 16:45:20
    在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造...java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下:import java.io.FileInputStream; import java.io.IOException; import ja...

    在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行判断过滤。
    比如,我们需要的是excel文件,如果不加验证内容,将一些可执行的文件通过更改后缀传输给你,就是一个很大的漏洞了。
    java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下:

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.HashMap;
    
    
    /**
     * @author wlx
     * @version 创建时间 2018年7月3日 下午16:37:26
     * <p>
     * 类描述:获取和判断文件头信息
     * |--文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。
     * |--头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现(implementation)。
     * |--为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。
     */
    public class CheckFileFormatUtil {
        // 缓存文件头信息-文件头信息
        private 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("D0CF11E0", "xls");//excel2003版本文件
            mFileTypes.put("5374616E64617264204A", "mdb");
            mFileTypes.put("252150532D41646F6265", "ps");
            mFileTypes.put("255044462D312E", "pdf");
            mFileTypes.put("504B0304", "docx");
            mFileTypes.put("504B0304", "xlsx");//excel2007以上版本文件
            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 文件头信息
         * @author wlx
         * <p>
         * 方法描述:根据文件路径获取文件头信息
         */
        public static String getFileType(String filePath) {
    //		System.out.println(getFileHeader(filePath));
    //		System.out.println(mFileTypes.get(getFileHeader(filePath)));
            return mFileTypes.get(getFileHeader(filePath));
        }
    
        /**
         * @param filePath 文件路径
         * @return 文件头信息
         * @author wlx
         * <p>
         * 方法描述:根据文件路径获取文件头信息
         */
        public static String getFileHeader(String filePath) {
            FileInputStream is = null;
            String value = null;
            try {
                is = new FileInputStream(filePath);
                byte[] b = new byte[4];
                /*
    			 * int read() 从此输入流中读取一个数据字节。int read(byte[] b) 从此输入流中将最多 b.length
    			 * 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len)
    			 * 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
    			 */
                is.read(b, 0, b.length);
                value = bytesToHexString(b);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (null != is) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return value;
        }
    
        /**
         * @param src 要读取文件头信息的文件的byte数组
         * @return 文件头信息
         * @author wlx
         * <p>
         * 方法描述:将要读取文件头信息的文件的byte数组转换成string类型表示
         */
        private static String bytesToHexString(byte[] src) {
            StringBuilder builder = new StringBuilder();
            if (src == null || src.length <= 0) {
                return null;
            }
            String hv;
            for (byte aSrc : src) {
                // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
                hv = Integer.toHexString(aSrc & 0xFF).toUpperCase();
                if (hv.length() < 2) {
                    builder.append(0);
                }
                builder.append(hv);
            }
    //		System.out.println(builder.toString());
            return builder.toString();
        }
    
        /**
         * @param args
         * @throws Exception
         * @author wlx
         * <p>
         * 方法描述:测试
         */
        public static void main(String[] args) throws Exception {
            final String fileType = getFileType("E:\\项目管理清单.xlsx");
            System.out.println(fileType);
            System.out.println(getFileHeader("E:\\项目管理清单.xlsx"));
        }
    }

    转自:https://blog.csdn.net/foget_over/article/details/51932711


    如果只是上传图片,可以不用这个方法,可以判断图片的大小,如果为NULL 那么也可以确认不是图片

    展开全文
  • java通过文件头内容判断文件类型

    热门讨论 2012-04-22 22:50:20
    java通过文件头内容判断文件类型
  • java-文件类型-文件类型判断

    千次阅读 2014-07-17 21:53:27
    摘要:文件类型判断:最直接的方法通过文件的后缀名字可以知道文件是sm
    摘要:1.文件类型的判断:最直接的方法通过文件的后缀名字可以知道文件类型,可是一些黑客会将病毒代码的后缀修改,以此来欺骗用户。2.文件类型的判断方法:直接读取文件的前2个字节即可判断文件类型。3.二进制文件和ascii文件的区别。4.MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。 
    

    1.文件类型的判断主要用于病毒的检测。

    2.文件类型的判断方法:读取文件的前两个字节即可判断文件的类型。(java实现代码:参考:http://blog.csdn.net/honwellhsueh/article/details/12913591)

    3.计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件):

    ASCII文本:ASCII字符构成的文本,而不是其它编码方式所构成。

    只含有用标准ASCII字符集编码的字符的数据和文本文件。文本文件(如字处理文件、批处理文件和源语言程序)通常都是ASCII文件,因为它们只含有字母、数字和常见的符号。SMTP只能传输ascii文件。


    文件可以看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成,根据数据的组织形式,可分为:ASCII和二进制文件,ASCII文件又称为文本文件,它的每个字节放一个ACSII代码,代表一个字符。二进制文件时把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,一个整数10000,在内存中占两个字节,如果按ASCII码输出,则占五个字节。按二进制形式输出,在磁盘上占两个字节。如下图所示:


    4.MIME:

    最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型

    根据文件内容前几个字节,判断文件类型,需要查看MIME type 查看,文件传输是是二进制,可以知道,通过前几个字节可以知道文件文件类型,文件类型的判断不能通过后缀名来判断,有可能会改后缀名。???上传文件时经常需要做文件类型判断,例如图片、文档等,普通做法是直接判断文件后缀名,而文艺青年为了防止各种攻击同时也会加上使用文件头信息判断文件类型。原理很简单:用文件头判断,直接读取文件的前2个字节即可。

    5.还是文件类型的判断,文件类型判是通过读取文件的前几个字节来判断的。原理:

    (1)将常用文件类型的前几个字节读取出来,转换成十六进制字符串。每个字节进行

        int v = src[i] & 0xFF;  
                String hv = Integer.toHexString(v);    //将int数字转换成16进制表示的字符串

    要先和0xFF做一次与运算。这是因为,整个文件流的字节数组中,有很多是负数,进行了与运算后,可以将前面的符号位都去掉,这样转换成的16进制字符串最多保留两位,如果是正数又小于10,那么转换后只有一位,需要在前面补0,这样做的目的是方便比较,取完前四位这个循环就可以终止了。 (参考自:http://xiaowei-qi-epro-com-cn.iteye.com/blog/1927851)

    Tips:其实不一定非得是表示成16进制字符串,也可以自己以十进制或者其他的表示。(个人猜测)

    (2)将常用的文件类型的16进制文件头信息建立一个hashmap。

    Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();

    key就是我们的十六进制数,value就是我们的文件类型。通过读取文件前几个字节。

    (如果想知道一个文件类型的16进制字符串的话,可以自己用程序去实现)。

    (3)第一步转换出来得16进制字符串type,在hashmap中进行遍历,找到这个key,如果这个key,如果key startwith 16进制type则说明这个文件就是key对应value的类型。

    (4)到底是读取多少位就可以表示文件的类型啦。有些读取前四个字节就可以区别出来,然后有些文件读取前四个字节是不行,例如apk文件如果读取前四个字节的话,读取出来的类型是zip。如果读取5个字节的话,就可以和zip区分开。(具体多少位,的看自己的文件类型)粗略的区别很好做。

    (5)关于读取前几个字节读取文件内容前几个字节的区别,如果以字节方式直接读取文件内容的前几个字节。会不会和判断文件的类型读取的数据一样那,这个还没有进行验证,等需要使用的时候再去验证吧,估计是不一样的,因为一个文件类型的,读取不同的文件的,前几个字节是一样。

    (6)下边常见的文件头信息16进制表示。当我读取文件的前四个字节的时候返回的一定是8位的十六进制数,当我们读取的是10个字节的时候返回的一定是20位的十六进制数。这样的话我们可以使用startwith来判断是否是这个文件类型,但是hashmap中的key必须是10字节。因为

    String str="abcd";
    String str1="ab";
    System.out.println(str1.startsWith(str));//结果为false

    如果读取文件时,是10个字节,但是我们的key是4个字节,一个短的字符串不可以能以一个长的字符串开头


    附常见文件的文件头信息

    常见文件的文件头(十进制)

    jpg: 255,216

    gif: 71,73

    bmp: 66,77

    png: 137,80

    doc: 208,207

    docx: 80,75

    xls: 208,207

    xlsx: 80,75

    js: 239,187

    swf: 67,87

    txt: 70,67

    mp3: 73,68

    wma: 48,38

    mid: 77,84

    rar: 82,97

    zip: 80,75

    xml: 60,63

    常用文件的文件头如下(16进制)

    JPEG (jpg),文件头:FFD8FF

    PNG (png),文件头:89504E47

    GIF (gif),文件头:47494638

    TIFF (tif),文件头:49492A00

    Windows Bitmap (bmp),文件头:424D

    CAD (dwg),文件头:41433130

    Adobe Photoshop (psd),文件头:38425053

    Rich Text Format (rtf),文件头:7B5C727466

    XML (xml),文件头:3C3F786D6C

    HTML (html),文件头:68746D6C3E

    Email [thorough only] (eml),文件头:44656C69766572792D646174653A

    Outlook Express (dbx),文件头:CFAD12FEC5FD746F

    Outlook (pst),文件头:2142444E

    MS Word/Excel (xls.or.doc),文件头:D0CF11E0

    MS Access (mdb),文件头:5374616E64617264204A

    WordPerfect (wpd),文件头:FF575043

    Postscript (eps.or.ps),文件头:252150532D41646F6265

    Adobe Acrobat (pdf),文件头:255044462D312E

    Quicken (qdf),文件头:AC9EBD8F

    Windows Password (pwl),文件头:E3828596

    ZIP Archive (zip),文件头:504B0304

    RAR Archive (rar),文件头:52617221

    Wave (wav),文件头:57415645

    AVI (avi),文件头:41564920

    Real Audio (ram),文件头:2E7261FD

    Real Media (rm),文件头:2E524D46

    MPEG (mpg),文件头:000001BA

    MPEG (mpg),文件头:000001B3

    Quicktime (mov),文件头:6D6F6F76

    Windows Media (asf),文件头:3026B2758E66CF11

    MIDI (mid),文件头:4D546864



    展开全文
  • java判断文件的真实类型

    万次阅读 2016-07-17 15:58:33
    在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行...java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下: package com.zhuifeng.util.excel; import java.io.FileInputStrea
  • java根据文件头判断文件类型

    千次阅读 2019-02-15 12:33:37
    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; publ...
  • 通常情况下,我们取文件的后缀名作为文件类型即可,但有时为了防止用户随便修改后缀名,就需要获取文件的真实类型。这时候可以通过文件的魔数来判别。魔数就是文件开头的那几个字节的数据。 代码实现 工具类代码...
  • java:根据文件头来判断文件类型

    千次阅读 2016-11-23 10:57:16
    根据文件后缀来判断文件类型,往往是不靠谱的,因为要考虑到,可能人为的更改文件后缀,导致一些问题。 因此,下面是详细的根据文件头信息来判断文件类型。 文件头的十六进制以后继续补充。package ...
  • java根据文件名称判断文件类型

    万次阅读 2017-03-31 15:31:38
    /* author:zss  * 日期:2017年3月31日  * 功能:根据文件名称判断... * 备注:文件类型不完善,有需要的自行添加  */ public class FileType { public String fileType(String fileName) { if (fileName ==
  • JAVA判断文件编码类型

    千次阅读 2013-09-04 14:18:42
    以下代码就可以判断文件是什么编码方式。  主要jar包:cpdetector.jar  下载地址http://cpdetector.sourceforge.net/  同时还需jchardet-1.0.jar这个包,否则detector.add(cpdetector.io.JC
  • java 简易文件类型判断根据文件后缀

    千次阅读 2019-01-11 17:01:55
    如需使用更高安全性的,请使用判断文件头的方式。 参考地址:文件头判断 https://www.cnblogs.com/ios9/p/7476355.html 1:图片 2:文档 可进行细分 3:视频 4:音频 工具类,可自行修改值。 涵盖常用文件类型。 ...
  • java读取文件时,判断文件类型与后缀是否一致,若是人文手动修改文件后缀,将excel改成doc,那这时候校验出来的结果应该是文件格式与后缀不一致这个结果。(不使用只判断后缀名的方式)
  • java文件的工具类,封装了常用的操作,尤其针对文件的实际类型,通过获取文件的byte,来查看文件起始字节的魔数值,通过魔数值来判断文件的类型,工具集合了常用的文件类型对应的魔数,也封装了文件类型的判断方法
  • java根据文件流判断文件类型

    千次阅读 2018-05-21 14:50:47
    原文https://www.cnblogs.com/chenglc/p/7117847.htmlimport java.io.FileInputStream; public class FileType{ public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = ne...
  • Java获取文件类型的5种方法

    千次阅读 2021-02-05 08:00:00
    前言工作中经常会用到,判断一个文件的文件类型,这里总结一把,一般判断文件类型的原理有2种方式:根据文件扩展名判断优点:速度快,代码简单缺点:无法判断出真实的文件类型,例如一些伪造的文件或者...
  • Java根据文件头判断文件类型

    千次阅读 2013-10-21 17:08:22
    public class FileType { private final static Map FILE_TYPE_MAP = new HashMap(); private FileType(){} ... //初始化文件类型信息 } private static void getAllFileType(){ FIL
  • java根据文件流判断文件类型(后缀名) import java.io.FileInputStream; public class FileType{ public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder ...
  • Java判断文件是否为图片

    万次阅读 2017-04-21 11:23:45
    Java检查文件类型有几种方法: 1.判断文件后缀名 String extension = &amp;amp;quot;&amp;amp;quot;; int i = fileName.lastIndexOf('.'); if (i &amp;amp;amp;gt; 0) { extension = fileName....
  • 目前需要进行对docx和zip格式文件进行判断判断后缀名肯定不行(后缀名可以恶意更改),头文件解析的话docx和zip的头文件时相同的,还有什么方式能准确区分这两种类型文件的?
  • java判断上传文件类型(笔记)

    万次阅读 2018-03-07 15:43:22
    之前做过一个功能,说是上传文件到服务器,但是所有文件excel、word、音乐、视频等都上传到一个文件夹,不利于查找,于是自己上网查询关于这...//文件类型枚取  public enum FileType { /** * JEPG. */ ...
  • 最早以前,写一个文件下载的程序,判断文件类型是个大问题,不断的根据MimetypesFile添加,现在mustang做了相应的类FileTypeMap。下面是个例子,package test;import javax.activation.*;import java.io.*;public ...
  • 这个文档教你如何,判读不同的文件编码类型,gbk,utf-8等等
  • java文件类型判断的工具类

    千次阅读 2019-03-01 13:26:24
    文件类型判断的工具类 package com.zmt.taobaoke.utils; import java.io.File; import org.apache.commons.fileupload.disk.DiskFileItem; import org.springframework.stereotype.Component; import org.spring...
  • 目前需要进行对docx和zip格式文件进行判断判断后缀名肯定不行(后缀名可以恶意更改),头文件解析的话docx和zip的头文件时相同的,还有什么方式能准确区分这两种类型文件的?
  • web判断文件的格式的时候,我们一般都是通过扩展名来判断,这个有点不太靠谱和安全,例如,修改文件名的后缀即可绕过判断。一般要判断是利用头文件来判断。下面是利用头文件来判断的代码: package ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 417,880
精华内容 167,152
关键字:

java判断文件类型方法

java 订阅