当前位置:首页 > 编程教程 > java技术文章 > java如何实现判断文件的真实类型

java判断文件的真实类型的方法

  • 发布时间:
  • 作者:码农之家
  • 点击:79

这篇文章主要知识点是关于java、判断文件、、Java实现的获取和判断文件头信息工具类用法示例 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

图解Java多线程设计模式
  • 类型:java编程大小:86.3 MB格式:PDF作者:结城浩
立即下载

java如何实现判断文件的真实类型

在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行判断过滤。

比如,我们需要的是excel文件,如果不加验证内容,将一些可执行的文件通过更改后缀传输给你,就是一个很大的漏洞了。

Java判断文件真实类型依靠的是文件的头部编码信息,具体代码如下:

package com.zhuifeng.util.excel; 
 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.HashMap; 
 
/** 
 * @author guoxk 
 * 
 * 类描述:获取和判断文件头信息 
 *  |--文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。 
 *  |--头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现(implementation)。 
 *  |--为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。 
 * 
 */ 
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"); 
  } 
 
  /** 
   * @author guoxk 
   * 
   * 方法描述:根据文件路径获取文件头信息 
   * @param filePath 文件路径 
   * @return 文件头信息 
   */ 
  public static String getFileType(String filePath) { 
//   System.out.println(getFileHeader(filePath)); 
//   System.out.println(mFileTypes.get(getFileHeader(filePath))); 
    return mFileTypes.get(getFileHeader(filePath)); 
  } 
 
  /** 
   * @author guoxk 
   * 
   * 方法描述:根据文件路径获取文件头信息 
   * @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]; 
      /* 
       * 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; 
  } 
 
  /** 
   * @author guoxk 
   * 
   * 方法描述:将要读取文件头信息的文件的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); 
    } 
//   System.out.println(builder.toString()); 
    return builder.toString(); 
  } 
  /** 
   * @author guoxk 
   * 
   * 方法描述:测试 
   * @param args 
   * @throws Exception 
   */ 
  public static void main(String[] args) throws Exception { 
    final String fileType = getFileType("E:\\补贴名单.xls"); 
    System.out.println(fileType); 
  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

Java实现的获取和判断文件头信息工具类用法示例

本文实例讲述了Java实现的获取和判断文件头信息工具类用法。分享给大家供大家参考,具体如下:

package test;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
/**
 * 获取和判断文件头信息
 *
 * @author Sud
 *
 */
public class GetTypeByHead {
  // 缓存文件头信息-文件头信息
  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("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("4D5A9000", "exe/dll");
    mFileTypes.put("75736167", "txt");
  }
  /**
   * 根据文件路径获取文件头信息
   *
   * @param filePath
   *      文件路径
   * @return 文件头信息
   */
  public static String getFileType(String filePath) {
    System.out.println(getFileHeader(filePath));
    System.out.println(mFileTypes.get(getFileHeader(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];
      /*
       * 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;
  }
  /**
   * 将要读取文件头信息的文件的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);
    }
    System.out.println(builder.toString());
    return builder.toString();
  }
  public static void main(String[] args) throws Exception {
    System.out.println("码农之家测试结果:");
    final String fileType = getFileType("D:\\php5ts.dll");
    System.out.println(fileType);
  }
}

运行结果:

Java实现的获取和判断文件头信息工具类用法示例

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

  • Java获取文件路径出现乱码的问题的解决方法
  • Java实现文件加密解密功能实例详解
  • java使用SFTP上传文件到资源服务器方法详解
  • Java文件和base64流相互转换功能实现方法
  • java判断文件 相关电子书
    学习笔记
    网友NO.978607

    java实现文件切片和合并的代码示例

    最近在学习大数据相关的知识点,其中需要实现文件的切片和合并,完整的java实现代码,以下贴出个人代码,仅供参考 首先建一个SplitUtil工具类,在工具类中有三个方法getSplitFile,getWrite,merge 1,文件拆分代码 public static void getSplitFile(String file,int count){ //预分配文件所占用的磁盘空间,在磁盘创建一个指定大小的文件,“r”表示只读,“rw”支持随机读写 try { RandomAccessFile raf = new RandomAccessFile(new File(file), "r"); //计算文件大小 long length = raf.length(); System.out.println(length); //计算文件切片后每一份文件的大小 long maxSize = length / count; System.out.println(maxSize); long offset = 0L;//定义初始文件的偏移量(读取进度) //开始切割文件 for(int i = 0; i count - 1; i++){ //count-1最后一份文件不处理 //标记初始化 long fbegin = offset; //分割第几份文件 long fend = (i+1) * maxSize; //写入文件 offset = g……

    网友NO.870584

    Java代码实现对properties文件有序的读写的示例

    最近遇到一项需求,要求把properties文件中的内容读取出来供用户修改,修改完后需要再重新保存到properties文件中。很简单的需求吧,可问题是Properties是继承自HashTable的,直接通过keySet()、keys()或entrySet()方法对Properties中的元素进行遍历时取出来的内容顺序与properties文件中的顺序不一致,这是问题一;问题二是就算取出来的时候是有序的,保存到文件中时又是无序的了。 当然,解决这两个问题的方法有很多。我最终采用的方法是自定义一个PropertiesUtil类,该类继承自Properties。PropertiesUtil提供一个返回由key按照存入顺序组成的List的方法,getKeyList(),这样问题一就解决了。那如何保证getKeyList()方法返回的就是有序的key组成的集合呢?我查看了一下Properties方法的源码,发现其setProperty()方法实际上就是调用了父类HashTable的put()方法,其次Properties在从文件中加……

    网友NO.122949

    java批量解析微信dat文件

    本文实例为大家分享了java批量解析微信dat文件的具体代码,供大家参考,具体内容如下 微信图片默认路径:C:\Users\b-eet\Documents\WeChat Files\b-eethoven\FileStorage\Image 微信文件利用Xor加密,计算之前需要知道异或值是多少。(好像每个人电脑上面的异或值都不同,在24行更改异或值) 异或值可用电脑自带的计算机计算(Xor) package cn.kgw;import java.io.*;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class WeChatImgRevert { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(10); Runnable r = () - { String[] fileName = GetFileName.getFileName("D:/dat"); int i = 0; for (String name : fileName) { try (InputStream reader = new FileInputStream("D:/dat/" + name)) { try (OutputStream writer = new FileOutputStream("D:/photo/" + name + ".jpg")) { byte[] bytes = new byte[1024]; int b; while ((b = reader.read(bytes)) !=……

    网友NO.689019

    Java动态代理的两种实现方式详解【附相关jar文件下载】

    本文实例讲述了Java动态代理的两种实现方式。分享给大家供大家参考,具体如下: 一说到动态代理,我们第一个想到肯定是大名鼎鼎的Spring AOP了。在AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由java内部的反射机制来实现的,cglib动态代理是通过继承来实现的,底层则是借助asm(Java 字节码操控框架)来实现的(采用字节码的方式,给A类创建一个子类B,子类B使用方法拦截的技术拦截所以父类的方法调用)。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,……

    网友NO.654148

    java将一个目录下的所有文件复制n次

    本文实例为大家分享了java将一个目录下的所有文件复制n次的具体代码,供大家参考,具体内容如下 1. 文件复制示意图 2.java程序 (1).调用 final static String SOURCESTRING = "/Users/amarao/360/download/test/";final static String OUTPUTSTRING = "/Users/amarao/360/download/test4/"; public static void main(String[] args) throws IOException { // 将SOURCESTRING下的文件复制3次到OUTPUTSTRING目录下 LCopyFileUtils.copyFile(SOURCESTRING, OUTPUTSTRING, 3); } (2).java工具类 /** * * 参考: * Java将一个目录下的所有数据复制到另一个目录下:https://www.jb51.net/article/167726.htm * Java复制文件的4种方式:https://www.jb51.net/article/70412.htm * */public class LCopyFileUtils { /** * 复制srcPath路径下的文件到destPath目录下 * * @param srcPath 源文件路径 * @param destPath 输出路径 * @param count 每个文件的复制次数 * @return 是否复制成功 */ public static boolean copyFile(String srcPa……

    <
    1
    >

    Copyright 2018-2020 www.xz577.com 码农之家

    版权投诉 / 书籍推广 / 赞助:520161757@qq.com