java实现上传文件类型检测过程解析

这篇文章主要介绍了java实现上传文件类型检测过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在进行文件上传时,特别是向普通用户开放文件上传功能时,需要对上传文件的格式进行控制,以防止黑客将病毒脚本上传。单纯的将文件名的类型进行截取的方式非常容易遭到破解,上传者只需要将病毒改换文件名便可以完成上传。

可以读取文件的十六进制的文件头,来判断文件真正的格式。

读取文件的二进制数据并将其转换为十六进制时,同类型文件的文件头数据是相同的,即使改变了其后缀,这个数据也不会改变

import java.io.*;
import java.util.HashMap;

public class GetFileType {

    // 缓存文件头信息-文件头信息
    public static final HashMap<String, String> mFileTypes = new HashMap<String, String>();
    static {
      mFileTypes.put("FFD8FFE0","jpg");
      mFileTypes.put("89504E47","png");
      mFileTypes.put("424DC6CC","bmp");
      mFileTypes.put("47494638","gif");
    }
    /**
   * 根据文件路径获取文件头信息
   *
   * @param filePath 文件路径
   * @return 文件头信息
   */
  public static String getFileType(String filePath) {
    String type = getFileHeader(filePath);
    System.out.println(type);
    return mFileTypes.get(type);
  }

  /**
   * 根据文件路径获取文件头信息
   *
   * @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);
    }
    return builder.toString();
  }

  public static void main(String[] args) {
    String path = "E:/file/2.png";
    String type = getFileType(path);
    System.out.println(type);
    path = "E:/file/timg.jpg";
    type = getFileType(path);
    System.out.println(type);
    path = "E:/file/bmp.bmp";
    type = getFileType(path);
    System.out.println(type);
    path = "E:/file/winter.gif";
    type = getFileType(path);
    System.out.println(type);
  }

}

运行输出

89504E47
png
FFD8FFE0
jpg
424DC6CC
bmp
47494638
gif

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

(0)

相关推荐

  • Java原生服务器接收上传文件 不使用MultipartFile类

    由于工作中 使用 MultipartFile 与现有的一些上传文件组件冲突 所以使用其他的接收上传文件的方法. 首先我把 MultipartFile 类的配置文件注释掉. <!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaul

  • JavaWeb实现多文件上传及zip打包下载

    本文实例为大家分享了javaweb多文件上传及zip打包下载的具体代码,供大家参考,具体内容如下 项目中经常会使用到文件上传及下载的功能.本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分. 首先明确一点: 无法通过页面的无刷新ajax请求,直接发下载.上传请求.上传和下载,均需要在整页请求的基础上实现.项目中一般通过构建form表单形式实现这一功能. 一.多文件上传 项目需求为实现多图片上传功能.参考测试了网上找到的众多插件方法后,决定选用Jquery原始

  • java实现文件上传下载

    本文实例为大家分享了java实现文件上传下载的具体代码,供大家参考,具体内容如下 一.上传 1.前端: <form method="post" action="FileUpload" enctype="multipart/form-data"> <input type="file" name="uploadFile" /> <br/> <input type=&qu

  • Java上传文件错误java.lang.NoSuchMethodException的解决办法

    错误详情: java.lang.NoSuchMethodException: [Lorg.springframework.web.multipart.MultipartFile;.<init>() at java.lang.Class.getConstructor0(Unknown Source) at java.lang.Class.getDeclaredConstructor(Unknown Source) at org.springframework.beans.BeanUtils.in

  • Java文件上传与文件下载实现方法详解

    本文实例讲述了Java文件上传与文件下载实现方法.分享给大家供大家参考,具体如下: Java文件上传 数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传.文件上传是数据上传的一种特例,指客户端向服务器上传文件.即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中. 1.上传表单要求 文件上传要求客户端提交特殊的请求--multipart请求,即包含多部分数据的请求.必须将<form/>标签的enctype属性值设为"multipart/form-d

  • java Springboot实现多文件上传功能

    前端采用layui框架,讲解多文件上传的完整实现功能. 前端html重点代码如下: <div class="layui-form-item"> <label class="layui-form-label">上传文件</label> <div class="layui-input-block"> <div class="layui-upload"> <butto

  • java文件上传下载代码实例

    本文实例为大家分享了java文件上传下载的具体代码,供大家参考,具体内容如下 文件上传 @RequestMapping(value="/uploadFile",method=RequestMethod.POST) public ResultObject uploadFiles(@RequestParam("file")MultipartFile file,HttpServletRequest request){ ResultObject rs = null;//返回

  • java 文件上传到读取文件内容的实例

    1.下载文件,将文件保存到本地.(只试用excel): 2.对文件的标题进行检验: 3.获取导入的批次(取一个表的一个值,加1): 4.循环获取文件某一个行,某一列的值,set到对象中: 5.检验值的合法性: 6.循环保存到对象中. 7.用map将错误的信息和正确的信息,JSONObject.fromObject(map): public String uploadFile() throws Exception { logger.info("开始导入规则文件:" + fileInput

  • Java利用MultipartFile实现上传多份文件的代码

    配置文件 <!-- 文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8"></property> <prop

  • java实现上传文件类型检测过程解析

    这篇文章主要介绍了java实现上传文件类型检测过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在进行文件上传时,特别是向普通用户开放文件上传功能时,需要对上传文件的格式进行控制,以防止黑客将病毒脚本上传.单纯的将文件名的类型进行截取的方式非常容易遭到破解,上传者只需要将病毒改换文件名便可以完成上传. 可以读取文件的十六进制的文件头,来判断文件真正的格式. 读取文件的二进制数据并将其转换为十六进制时,同类型文件的文件头数据是相同的,即使改

  • SpringBoot后端上传文件类型检测方式

    目录 本文通过文件流头部判断文件类型 1.添加配置文件checkFileHeader.properties 2.编写读取properties文件类 3.编写拦截器 4.配置拦截文件 文件上传大部分通过web前端判断后尾名或者service后端判断后尾名,这种操作具有一定的风险,比如:我可以将一个jsp页面,修改后尾名改成jpg文件进行上传,由于图片预览功能,这个文件会被执行,这时就可以发送用户数据到指定的服务下,窃取用户信息. 本文通过文件流头部判断文件类型 不同的文件具有不同的头部,比如: 不

  • 简述Java异步上传文件的三种方式

    本文为大家分享了三种Java异步上传文件方式,供大家参考,具体内容如下 用第三方控件,如Flash,ActiveX等浏览器插件上传. 使用隐藏的iframe模拟异步上传. 使用XMLHttpRequest2来实现异步上传. 第一种使用浏览器插件上传,需要一定的底层编码功底,在这里我就不讲了,以免误人子弟,提出这点大家可以自行百度. 第二种使用隐藏的iframe模拟异步上传.为什么在这里说的是模拟呢?因为我们其实是将返回结果放在了一个隐藏的iframe中,所以才没有使当前页面跳转,感觉就像是异步操

  • java web上传文件和下载文件代码片段分享

    本文实例为大家分享了java web上传文件和下载文件的具体代码,供大家参考,具体内容如下 /** * Purpose:上传文档 * * @param req * @param fileTitle * @param fileType * @param fileDesc * @return */ @RequestMapping("upload") public ModelAndView upload(HttpServletRequest req, String fileType, Str

  • Java实现上传文件图片到指定服务器目录

    具体代码如下所示: ***web.xml*** <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xm

  • java实现上传文件到FTP

    本文实例为大家分享了java实现上传文件到FTP的具体代码,供大家参考,具体内容如下 需求说明:将指定文件上传到FTP,上传成功后修改文件名. 获取文件名及路径(这里是从数据库获取,所以前面的代码就不CV了) /**      * 测试上传      * @param map 从数据库获取到的文件信息 (包含文件路径FILE_PATH 文件类型FILE_TYPE等信息)      */      public void testUpdFtpFile(Map<String,Object> map

  • PHP判断上传文件类型的解决办法

    分享给大家php判断上传文件类型的方法,大家一起学习学习. /** * 读取文件前几个字节 判断文件类型 * @return String */ function checkTitle($filename){ $file=fopen($filename, "rb"); $bin=fread($file, 2); //只读2字节 fclose($file); $strInfo =@unpack("c2chars", $bin); $typeCode=intval($s

  • JS简单验证上传文件类型的方法

    本文实例讲述了JS简单验证上传文件类型的方法.分享给大家供大家参考,具体如下: function checkType(){ //得到上传文件的值 var fileName=document.getElementById("file_logo").value; //返回String对象中子字符串最后出现的位置. var seat=fileName.lastIndexOf("."); //返回位于String对象中指定位置的子字符串并转换为小写. var extensi

  • php限制上传文件类型并保存上传文件的方法

    本文实例讲述了php限制上传文件类型并保存上传文件的方法.分享给大家供大家参考.具体如下: 下面的代码演示了php中如何获取用户上传的文件,并限制文件类型的一般图片文件,最后保存到服务器 <?php $allowedExts = array("gif", "jpeg", "jpg", "png"); $extension = end(explode(".", $_FILES["file&qu

  • JS控制FileUpload的上传文件类型实例代码

    JS代码如下: function CheckFile(obj) { var array = new Array('gif', 'jpeg', 'png', 'jpg'); //可以上传的文件类型 if (obj.value == '') { alert("让选择要上传的图片!"); return false; } else { var fileContentType = obj.value.match(/^(.*)(\.)(.{1,8})$/)[3]; //这个文件类型正则很有用:)

随机推荐