利用文件头判断文件类型

上传文件时经常需要做文件类型判断,例如图片、文档等,普通做法是直接判断文件后缀名,而文艺青年为了防止各种攻击同时也会加上使用文件头信息判断文件类型。

原理很简单:用文件头判断,直接读取文件的前2个字节即可。

  1 public class FileUtil {
  2     /**
  3      * byte数组转换成16进制字符串
  4      *
  5      * @param src
  6      * @return
  7      */
  8     private static String bytesToHexString(byte[] src) {
  9         StringBuilder stringBuilder = new StringBuilder();
 10         if (src == null || src.length <= 0) {
 11             return null;
 12         }
 13         for (int i = 0; i < src.length; i++) {
 14             // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
 15             String hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
 16             if (hv.length() < 2) {
 17                 stringBuilder.append(0);
 18             }
 19             stringBuilder.append(hv);
 20         }
 21         return stringBuilder.toString();
 22     }
 23
 24     /**
 25      * 根据文件路径获取文件头信息
 26      *
 27      * @param filePath
 28      *            文件路径
 29      * @return 文件头信息
 30      */
 31     public static String getFileType(String filePath) {
 32         String bytes = getFileHeader(filePath);
 33         if (bytes != null) {
 34             if (bytes.contains("FFD8FF")) {
 35                 return "jpg";
 36             } else if (bytes.contains("89504E47")) {
 37                 return "png";
 38             } else if (bytes.contains("47494638")) {
 39                 return "gif";
 40             } else if (bytes.contains("49492A00")) {
 41                 return "tif";
 42             } else if (bytes.contains("424D")) {
 43                 return "bmp";
 44             }
 45         }
 46         return null;
 47     }
 48
 49
 50     /**
 51      * 根据文件路径获取文件头信息
 52      *
 53      * @param filePath
 54      *            文件路径
 55      * @return 文件头信息
 56      */
 57     public static String getFileHeader(String filePath) {
 58         FileInputStream is = null;
 59         String value = null;
 60         try {
 61             is = new FileInputStream(filePath);
 62             byte[] b = new byte[4];
 63             is.read(b, 0, b.length);
 64             value = bytesToHexString(b);
 65         } catch (Exception e) {
 66         } finally {
 67             if (null != is) {
 68                 try {
 69                     is.close();
 70                 } catch (IOException e) {
 71                 }
 72             }
 73         }
 74         return value;
 75     }
 76
 77     public static void main(String[] args) throws Exception {
 78         System.out.println(getFileType("F:\\old file\\论坛头像数据采集\\未命名.bmp"));
 79     }
 80 }

这里增加客户端jsp调用实例

  1 String ext = FileUtil.getFileType(srcFilePath);
  2 if(app.getFileExts()!=null && !app.getFileExts().contains(ext)){
  3       File invalidFile = new File(srcFilePath);
  4       if(invalidFile.isFile()) invalidFile.delete();
  5       System.out.println("Unsupport file type: "+ext+" in tx:"+tx.getTransactionId());
  6       throw new Exception("Unsupport file type: "+ext+" in tx:"+tx.getTransactionId());
  7 }

顺便贴上各种常见文件头

  1 JPEG (jpg),文件头:FFD8FF
  2 PNG (png),文件头:89504E47
  3 GIF (gif),文件头:47494638
  4 TIFF (tif),文件头:49492A00
  5 Windows Bitmap (bmp),文件头:424D
  6 CAD (dwg),文件头:41433130
  7 Adobe Photoshop (psd),文件头:38425053
  8 Rich Text Format (rtf),文件头:7B5C727466
  9 XML (xml),文件头:3C3F786D6C
 10 HTML (html),文件头:68746D6C3E
 11 Email [thorough only] (eml),文件头:44656C69766572792D646174653A
 12 Outlook Express (dbx),文件头:CFAD12FEC5FD746F
 13 Outlook (pst),文件头:2142444E
 14 MS Word/Excel (xls.or.doc),文件头:D0CF11E0
 15 MS Access (mdb),文件头:5374616E64617264204A
 16 WordPerfect (wpd),文件头:FF575043
 17 Postscript (eps.or.ps),文件头:252150532D41646F6265
 18 Adobe Acrobat (pdf),文件头:255044462D312E
 19 Quicken (qdf),文件头:AC9EBD8F
 20 Windows Password (pwl),文件头:E3828596
 21 ZIP Archive (zip),文件头:504B0304
 22 RAR Archive (rar),文件头:52617221
 23 Wave (wav),文件头:57415645
 24 AVI (avi),文件头:41564920
 25 Real Audio (ram),文件头:2E7261FD
 26 Real Media (rm),文件头:2E524D46
 27 MPEG (mpg),文件头:000001BA
 28 MPEG (mpg),文件头:000001B3
 29 Quicktime (mov),文件头:6D6F6F76
 30 Windows Media (asf),文件头:3026B2758E66CF11
 31 MIDI (mid),文件头:4D546864

内容来自:cnblogs:牛奶、不加糖

时间: 2024-10-21 03:58:38

利用文件头判断文件类型的相关文章

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

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

根据文件头检测文件类型

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

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)

利用文件头来实现的一些文件类型的方法封装

package com.opslab.util.algorithmImpl; import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.Iterator;import java.util.Map; /** * 利用文件头来实现的一些文件类型的方法封装 */publ

利用PHP取二进制文件头判断文件类型

<?php $files = array('D:\no.jpg', 'D:\no.png','D:\no2.JPEG','D:\no.BMP'); $fileTypes = array( 7790 => 'exe', 7784 => 'midi', 8297 => 'rar', 255216 => 'jpg', 7173 => 'gif', 6677 => 'bmp', 13780 => 'png' ); foreach($files as $file) {

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

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

用java流方式判断文件类型

这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 package org.filetype; /** * 文件类型枚取 */ public enum FileType { /** * JEPG. */ JPEG("FFD8FF"), /** * PNG. */ PNG("89504E47"), /** * GIF. */ GIF(

Linux中用st_mode判断文件类型

Linux中用st_mode判断文件类型 2012-12-11 12:41 14214人阅读 评论(4) 收藏 举报  分类: Linux(8)  C/C++(20)  版权声明:本文为博主原创文章,未经博主允许不得转载. 在Linux中,可以利用stat()函数来获取一个文件的状态 [cpp] view plain copy #include <sys/stat.h> #include <unistd.h> int stat(const char *file_name, stru

UNIX环境编程学习笔记(6)——文件I/O之判断文件类型

lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: (1) 普通文件(regular file) 这种文件包含了某种形式的数据,这些数据无论是文件还是二进制对于 UNIX 内核而言都是一样的.对普通文件内容的解释有处理该文件的应用程序进行. (2) 目录文件(directory file) 目录文件包含了其他文件的名字以及指向与这些文件有关信息的指