文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot文件上传控制及Java怎么获取和判断文件头信息

2023-05-30 18:08

关注

这篇文章给大家分享的是有关SpringBoot文件上传控制及Java怎么获取和判断文件头信息的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

首先,是建立一个标准的SpringBoot 的工程,这里使用的IDE是Intellij Idea,为了方便配置,将默认的配置文件替换为了application.yml。

SpringBoot文件上传控制及Java怎么获取和判断文件头信息

在index.html中进行文件上传功能,这里使用的文件上传方式是ajax,当然也可以按照自己的具体要求使用传统的表单文件上传。

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>上传测试</title>  <script type="text/javascript" src="js/jquery-3.2.1.min.js"></script> </head> <body>  <input id="file" type="file" name="file"/>  <br/>  <button id="upload" onclick="doUpload()">上传</button>  <progress id="progressBar" value="0" max="100"></progress>  <script>   function doUpload() {    var fileObj = document.getElementById("file").files[0]; // js 获取文件对象    var FileController = "/upload";     // 接收上传文件的后台地址    // FormData 对象    var form = new FormData();    form.append("file",fileObj);    // XMLHttpRequest 对象    var xhr = new XMLHttpRequest();    //为请求添加返回处理函数    xhr.onreadystatechange=function () {     if(this.readyState == 4 && this.status == 200){      var b = this.responseText;      if(b == "success"){       alert("上传成功!");      }else{       alert("上传失败!");      }     }    };    xhr.open("post", FileController, true);    //使用进度条记录上传进度    xhr.upload.addEventListener("progress", progressFunction, false);    xhr.send(form);   }   function progressFunction(evt) {    var progressBar = document.getElementById("progressBar");    var percentageDiv = document.getElementById("percentage");    if (evt.lengthComputable) {     progressBar.max = evt.total;     progressBar.value = evt.loaded;     percentageDiv.innerHTML = Math.round(evt.loaded / evt.total * 100) + "%";    }   }  </script> </body> </html>

在MainController添加文件上传的API,并返回上传结果

@PostMapping("/upload")  @ResponseBody  public String upload(HttpServletRequest request, @RequestParam("file") MultipartFile file) {   String path = "E://upload//";   String fileName = file.getOriginalFilename();   System.out.println(fileName);   File targetFile = new File(path);   if (!targetFile.exists()) {    targetFile.mkdirs();   }   File saveFile=new File(path+fileName);   // 保存   try {    file.transferTo(saveFile);    return "success";   } catch (Exception e) {    e.printStackTrace();    return "fail";   }  }

这时,我们进行测试,就可以发现,文件上传已经完成了。

SpringBoot文件上传控制及Java怎么获取和判断文件头信息

SpringBoot文件上传控制及Java怎么获取和判断文件头信息

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

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

因为我们发现,在我们读取文件的二进制数据并将其转换为十六进制时,同类型文件的文件头数据是相同的,即使改变了其后缀,这个数据也不会改变,例如,png文件的文件头为“89504E47”。

首先,我们将文件的数据进行读取

public class FileUtil {  public static String getFileHeader( MultipartFile file) {   InputStream is = null;   String value = null;   try {    is = file.getInputStream();    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;  }  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++) {    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();  } }

然后在文件上传的api中进行调用

FileUtil.getFileHeader(file)

这时候,我们只需要进行简单的字符串比对,判断调用的返回值是否为“89504E47”,就可以知道上传的是否为png文件。

下面看下 Java 获取和判断文件头信息

 import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap;  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");  }    public static String getFileType(String filePath) {   System.out.println(getFileHeader(filePath));   System.out.println(mFileTypes.get(getFileHeader(filePath)));   return mFileTypes.get(getFileHeader(filePath));  }    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;  }    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 {   final String fileType = getFileType("D:\\Ry4S_JAVA.dll");   System.out.println(fileType);  } }

springboot是什么

springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,SpringBoot也是一个服务于框架的框架,服务范围是简化配置文件。

感谢各位的阅读!关于“SpringBoot文件上传控制及Java怎么获取和判断文件头信息”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯