java:根据文件头来判断文件类型
根据文件后缀来判断文件类型,往往是不靠谱的,因为要考虑到,可能人为的更改文件后缀,导致一些问题。
因此,下面是详细的根据文件头信息来判断文件类型。
文件头的十六进制以后继续补充。
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:根据文件头来判断文件类型相关推荐
- java判断文件头_java通过文件头来判断文件类型
importjava.io.FileInputStream;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map. ...
- java file 获取文件类型_Android中Java根据文件头获取文件类型
前面贴过Android系统内部的MediaFile类来获取文件类型的办法,这个类主要是根据文件的扩展名来判断,其准确性不是很好.具体可查看Android系统使用MediaFile类判断音频文件类型.其 ...
- python如何区分文件类型_python通过文件头判断文件类型
对于提供上传的服务器,需要对上传的文件进行过滤. 本文为大家提供了python通过文件头判断文件类型的方法,避免不必要的麻烦. 分享代码如下 import struct # 支持文件类型 # 用16进 ...
- php读取某类型文件代码,php代码实现读取文件头判断文件类型
php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 案例: //为图片的路径可以用d:/upload/11.jpg等绝对路径 $file = fopen($filename, &q ...
- mysql文件头标记_PHP根据文件头检测文件类型
文件签名一般都在文件的头部,如果你用十六进制方式查看文件,你就可以看到文件的一些签名信息.如用uestudio以十六进制方式查看zip格式的文件,其文件内容头部有50 4B 03 04这样的十六进制信 ...
- python 通过文件头获取文件类型mimetype
一.MIME Type是什么? 资源的媒体类型 MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序打开 ...
- java文件头_Java根据文件头判断文件类型
public class FileType { private final static Map FILE_TYPE_MAP = new HashMap(); private FileType(){} ...
- curl mimetype类型_根据二进制流及文件头获取文件类型mime-type
图片格式查看: 用十六进制编辑器察看过图片的文件头,分析的结果,供大家参考: 1.JPEG/JPG - 文件头标识 (2 bytes): $ff, $d8 (SOI) (JPEG 文件标识) - 文件 ...
- 通过16进制文件头判断文件类型
package cn.edu.hactcm.cfcms.utils; import java.io.FileInputStream; import java.io.IOException; impor ...
最新文章
- windows AD/DNS服务器搭建
- IT界顶级大咖讲解如何获得月薪5万以上的秘诀干货!
- 5、Makefile基础知识汇总(转自陈皓总述)
- Boost:boost::bimaps::multiset_of的测试程序
- 读书笔记--互联网必读《长尾理论》作者克里斯.安德森
- java怎么使用floor_Java floor() 方法
- 期货大赛项目|九,fileinput插件的应用
- 编程语言对比 字面常量
- HTML思维导图+学习笔记+实际案例
- 注销、重启、关机快捷键命令
- android调手机通话,手机通话声音小?这样设置能让音量放大几倍,安卓苹果手机通用...
- 外媒介绍全新表情密码 用emoji解锁安全吗?
- Origin绘制双x,y轴图像
- 【Linux命令篇】正则表达式浅析
- linux启动一个进程吗,当你在Linux上启动一个进程时会发生什么?
- Mosca MQTT
- 基于滑模预测控制的海底采矿车轨迹跟踪算法
- C#学习笔记(四):.net 第一个业务逻辑(同名用户不可创建)(优化逻辑)
- uushare.com 推出了手机版
- 使用VS进行debug时的工作目录位置