Java根据文件头获取文件类型

[来源] 达内    [编辑] 达内   [时间]2012-12-25

为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。具体代码如

  件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。

  为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。具体代码如下:

  Java代码 :

  package com.test.day11.io;

  import java.io.FileInputStream;

  import java.io.IOException;

  import java.util.HashMap;

  /**

  * 获取和判断文件头信息

  *

  * @author bigbird

  *

  */

  public class FileType {

  //缓存文件头信息-文件头信息

  public static final HashMap mFileTypes = new HashMap();

  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("504B0304", "docx");

  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");

  mFileTypes.put("", "");

  mFileTypes.put("", "");

  }

  /**

  * 根据文件路径获取文件头信息

  *

  * @param filePath

  * 文件路径

  * @return 文件头信息

  */

  public static String getFileType(String filePath) {

  return mFileTypes.get(getFileHeader(filePath));

  }

  /**

  * 根据文件路径获取文件头信息

  *

  * @param filePath

  * 文件路径

  * @return 文件头信息

  */

  public static String getFileHeader(String filePath) {

  FileInputStream is = null;

  String value = null;

  try {

  is = new FileInputStream(filePath);

  byte[] b = new byte[4];

  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);

  }

  return builder.toString();

  }

  public static void main(String[] args) throws Exception {

  final String fileType = getFileType("E:/读书笔记/Java编程思想读书笔记。docx");

  System.out.println(fileType);

  }

  }

资源下载