文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现
(implementation)。
为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。具体代码如下:
Java代码
:
1 import java.io.FileInputStream; 2 import java.io.IOException; 3 import java.util.HashMap; 4 5 /** 6 * 获取和判断文件头信息 7 * @create Victoria 201401 copy from Internet by bigbird 8 */ 9 public class FileType { 10 // 缓存文件头信息-文件头信息 11 public static final HashMap<String, String> mFileTypes = new HashMap<String, String>(); 12 static { 13 // images 14 mFileTypes.put("FFD8FF", "jpg"); 15 mFileTypes.put("89504E47", "png"); 16 mFileTypes.put("47494638", "gif"); 17 mFileTypes.put("49492A00", "tif"); 18 mFileTypes.put("424D", "bmp"); 19 // 20 mFileTypes.put("41433130", "dwg"); // CAD 21 mFileTypes.put("38425053", "psd"); 22 mFileTypes.put("7B5C727466", "rtf"); // 日记本 23 mFileTypes.put("3C3F786D6C", "xml"); 24 mFileTypes.put("68746D6C3E", "html"); 25 mFileTypes.put("44656C69766572792D646174653A", "eml"); // 邮件 26 mFileTypes.put("D0CF11E0", "doc"); 27 mFileTypes.put("5374616E64617264204A", "mdb"); 28 mFileTypes.put("252150532D41646F6265", "ps"); 29 mFileTypes.put("255044462D312E", "pdf"); 30 mFileTypes.put("504B0304", "docx"); 31 mFileTypes.put("52617221", "rar"); 32 mFileTypes.put("57415645", "wav"); 33 mFileTypes.put("41564920", "avi"); 34 mFileTypes.put("2E524D46", "rm"); 35 mFileTypes.put("000001BA", "mpg"); 36 mFileTypes.put("000001B3", "mpg"); 37 mFileTypes.put("6D6F6F76", "mov"); 38 mFileTypes.put("3026B2758E66CF11", "asf"); 39 mFileTypes.put("4D546864", "mid"); 40 mFileTypes.put("1F8B08", "gz"); 41 mFileTypes.put("", ""); 42 mFileTypes.put("", ""); 43 } 44 45 /** 46 * 根据文件路径获取文件头信息 47 * 48 * @param filePath 49 * 文件路径 50 * @return 文件头信息 51 */ 52 public static String getFileType(String filePath) { 53 return mFileTypes.get(getFileHeader(filePath)); 54 } 55 56 /** 57 * 根据文件路径获取文件头信息 58 * 59 * @param filePath 60 * 文件路径 61 * @return 文件头信息 62 */ 63 public static String getFileHeader(String filePath) { 64 FileInputStream is = null; 65 String value = null; 66 try { 67 is = new FileInputStream(filePath); 68 byte[] b = new byte[4]; 69 is.read(b, 0, b.length); 70 value = bytesToHexString(b); 71 } catch (Exception e) { 72 } finally { 73 if (null != is) { 74 try { 75 is.close(); 76 } catch (IOException e) { 77 } 78 } 79 } 80 return value; 81 } 82 83 /** 84 * 将要读取文件头信息的文件的byte数组转换成string类型表示 85 * 86 * @param src 87 * 要读取文件头信息的文件的byte数组 88 * @return 文件头信息 89 */ 90 private static String bytesToHexString(byte[] src) { 91 StringBuilder builder = new StringBuilder(); 92 if (src == null || src.length <= 0) { 93 return null; 94 } 95 String hv; 96 for (int i = 0; i < src.length; i++) { 97 // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写 98 hv = Integer.toHexString(src[i] & 0xFF).toUpperCase(); 99 if (hv.length() < 2) { 100 builder.append(0); 101 } 102 builder.append(hv); 103 } 104 return builder.toString(); 105 } 106 107 public static void main(String[] args) throws Exception { 108 final String fileType = getFileType("E:/读书笔记/Java编程思想读书笔记.docx"); 109 System.out.println(fileType); 110 } 111 }