根据文件后缀来判断文件类型,往往是不靠谱的,因为要考虑到,可能人为的更改文件后缀,导致一些问题。
因此,下面是详细的根据文件头信息来判断文件类型。
文件头的十六进制以后继续补充。

package com.webserver.utils;import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;  /*** <p>Title:CheckExcelFileTypeUtil </p>* <p>Description: * 类描述:获取和判断文件头信息  *    |--文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。 *    |--头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现(implementation)。 *    |--为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。 * 问题说明:*    |--文件头有些信息在windows上运行,对应不上。是否是在linux下才是这些文件头?还有待验证。暂时因为只是需要判断excel格式,因此暂不验证。有空我会补充。* </p>* @author 鲁东顺* @date 2016-11-23上午9:58:39*/
public class CheckExcelFileTypeUtil {// 缓存文件头信息-文件头信息  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");  }  /*** <p>Title:getFileType </p>* <p>Description: 根据文件路径获取文件头信息</p>* @param filePath  文件路径 * @return 文件头信息 * @author 鲁东顺* @date 2016-11-23上午10:06:40*/public static String getFileType(String filePath) {  System.out.println(getFileHeader(filePath));  //返回十六进制  如:504B0304//System.out.println(mFileTypes.get(getFileHeader(filePath)));  //xlsxreturn mFileTypes.get(getFileHeader(filePath));  }  /*** <p>Title:getFileTypeByFileInputStream </p>* <p>Description: 根据文件流获取文件头信息</p>* @param is   文件流* @return  文件头信息* @author 鲁东顺* @date 2016-11-23上午10:23:10*/public static String getFileTypeByFileInputStream(FileInputStream is) {  return mFileTypes.get(getFileHeaderByFileInputStream(is));  }  /*** <p>Title:getFileHeader </p>* <p>Description: 根据文件路径获取文件头信息 </p>* @param filePath 文件路径 * @return 十六进制文件头信息 * @author 鲁东顺* @date 2016-11-23上午10:08:16*/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) {  } finally {  if (null != is) {  try {  is.close();  } catch (IOException e) {  }  }  }  return value;  }  /*** <p>Title:getFileHeaderByFileInputStream </p>* <p>Description: 根据文件流获取文件头信息</p>* @param is  文件流* @return  十六进制文件头信息 * @author 鲁东顺* @date 2016-11-23上午10:20:27*/public static String getFileHeaderByFileInputStream(FileInputStream is) {  String value = null;  try {  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) {  }  }  }  return value;  }  /*** <p>Title:bytesToHexString </p>* <p>Description: 将要读取文件头信息的文件的byte数组转换成string类型表示 </p>* @param src 要读取文件头信息的文件的byte数组 * @return  文件头信息 * @author 鲁东顺* @date 2016-11-23上午10:09:56*/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(builder.toString());  return builder.toString();  }  /*** <p>Title:main </p>* <p>Description: 测试</p>* @param args* @throws Exception* @author 鲁东顺* @date 2016-11-23上午10:11:37*/public static void main(String[] args) throws Exception {  /*//测试1...根据文件全路径final String fileType = getFileType("E:\\服务申请模板.xlsx");  System.out.println(fileType);  *///测试2...根据流FileInputStream is = null;  is = new FileInputStream("E:\\服务申请模板.xlsx");  final String fileType2 = getFileTypeByFileInputStream(is);  System.out.println(fileType2); }
}

java:根据文件头来判断文件类型相关推荐

  1. java判断文件头_java通过文件头来判断文件类型

    importjava.io.FileInputStream;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map. ...

  2. java file 获取文件类型_Android中Java根据文件头获取文件类型

    前面贴过Android系统内部的MediaFile类来获取文件类型的办法,这个类主要是根据文件的扩展名来判断,其准确性不是很好.具体可查看Android系统使用MediaFile类判断音频文件类型.其 ...

  3. python如何区分文件类型_python通过文件头判断文件类型

    对于提供上传的服务器,需要对上传的文件进行过滤. 本文为大家提供了python通过文件头判断文件类型的方法,避免不必要的麻烦. 分享代码如下 import struct # 支持文件类型 # 用16进 ...

  4. php读取某类型文件代码,php代码实现读取文件头判断文件类型

    php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 案例: //为图片的路径可以用d:/upload/11.jpg等绝对路径 $file = fopen($filename, &q ...

  5. mysql文件头标记_PHP根据文件头检测文件类型

    文件签名一般都在文件的头部,如果你用十六进制方式查看文件,你就可以看到文件的一些签名信息.如用uestudio以十六进制方式查看zip格式的文件,其文件内容头部有50 4B 03 04这样的十六进制信 ...

  6. python 通过文件头获取文件类型mimetype

    一.MIME Type是什么? 资源的媒体类型 MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序打开 ...

  7. java文件头_Java根据文件头判断文件类型

    public class FileType { private final static Map FILE_TYPE_MAP = new HashMap(); private FileType(){} ...

  8. curl mimetype类型_根据二进制流及文件头获取文件类型mime-type

    图片格式查看: 用十六进制编辑器察看过图片的文件头,分析的结果,供大家参考: 1.JPEG/JPG - 文件头标识 (2 bytes): $ff, $d8 (SOI) (JPEG 文件标识) - 文件 ...

  9. 通过16进制文件头判断文件类型

    package cn.edu.hactcm.cfcms.utils; import java.io.FileInputStream; import java.io.IOException; impor ...

最新文章

  1. windows AD/DNS服务器搭建
  2. IT界顶级大咖讲解如何获得月薪5万以上的秘诀干货!
  3. 5、Makefile基础知识汇总(转自陈皓总述)
  4. Boost:boost::bimaps::multiset_of的测试程序
  5. 读书笔记--互联网必读《长尾理论》作者克里斯.安德森
  6. java怎么使用floor_Java floor() 方法
  7. 期货大赛项目|九,fileinput插件的应用
  8. 编程语言对比 字面常量
  9. HTML思维导图+学习笔记+实际案例
  10. 注销、重启、关机快捷键命令
  11. android调手机通话,手机通话声音小?这样设置能让音量放大几倍,安卓苹果手机通用...
  12. 外媒介绍全新表情密码 用emoji解锁安全吗?
  13. Origin绘制双x,y轴图像
  14. 【Linux命令篇】正则表达式浅析
  15. linux启动一个进程吗,当你在Linux上启动一个进程时会发生什么?
  16. Mosca MQTT
  17. 基于滑模预测控制的海底采矿车轨迹跟踪算法
  18. C#学习笔记(四):.net 第一个业务逻辑(同名用户不可创建)(优化逻辑)
  19. uushare.com 推出了手机版
  20. 使用VS进行debug时的工作目录位置

热门文章

  1. 【IoT】联网 WIFI 设计之瑞昱 RTL8710 使用基础
  2. 手机端网页实现预览PPT word Excel
  3. TensorFlow 模型的保存与恢复
  4. 如何关闭台式计算机休眠,如何让电脑不自动休眠 Win7怎么关闭自动休眠功能
  5. 使用H5的Canvas,实现证件照的识别
  6. win10系统重置密码
  7. 荔枝音质高保真的降噪技术实践与研究
  8. 一核心两主题,云上如何定义智能数控?
  9. 性能测试接口请求超时问题_如何获得更好的性能:超时的情况
  10. 移动端 touch事件 过渡事件 动画事件