前言

文件上传是一个在开发中很常见的需求场景,通常出于安全考虑,我们会对上传的文件进行类型校验,其中常见的有后缀名校验,mime-type校验

话不多说,直接上代码

1.首先定义允许上传的文件类型白名单

  1. private static final String[] suffixWhiteList = {"PNG","JPEG","JPG","GIF"};
  2. private static final String[] mimeTypeWhiteList = {"image/jpeg","image/gif","image/png"};

2.后缀名校验

  1. /**
  2. * 文件后缀名校验
  3. *
  4. * @param fileName
  5. * 文件名称
  6. * @return
  7. */
  8. public static boolean suffixCheck(String fileName) {
  9. if(fileName == null || "".equals(fileName)){
  10. return false;
  11. }
  12. //从最后一个点之后截取字符串
  13. String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
  14. //白名单匹配
  15. boolean anyMatch = Arrays.stream(suffixWhiteList).anyMatch(x -> x.equalsIgnoreCase(suffix));
  16. return anyMatch;
  17. }

3.mime-type校验,因为需要获取文件的mimeType,我引入了第三方的jar包(其他同样功能的jar包都可以)

  1. //MIME-TYPE工具包
  2. compile("net.sf.jmimemagic:jmimemagic:0.1.3")
  1. /**
  2. * MIMETYPE校验
  3. * @return
  4. */
  5. public static boolean mimeTypeCheck(MultipartFile uploadFile){
  6. if (uploadFile.isEmpty()){
  7. return false;
  8. }
  9. //文件名
  10. String fileName = uploadFile.getOriginalFilename();
  11. // 获取文件后缀
  12. String suffix=fileName.substring(fileName.lastIndexOf("."));
  13. File picFile = null;
  14. try {
  15. // 用uuid作为文件名,防止生成的临时文件重复
  16. picFile = File.createTempFile(UuidUtils.getUuid(), suffix);
  17. FileUtils.copyInputStreamToFile(uploadFile.getInputStream(),picFile);
  18. // MultipartFile to File
  19. MagicMatch match = Magic.getMagicMatch(picFile, false);
  20. String mimeType = match.getMimeType();
  21. // 白名单匹配
  22. boolean anyMatch = Arrays.stream(mimeTypeWhiteList).anyMatch(x -> x.equalsIgnoreCase(mimeType));
  23. return anyMatch;
  24. } catch (IOException e) {
  25. LOGGER.error("生成临时文件异常",e);
  26. } catch (Exception e) {
  27. LOGGER.error("MIME-TYPE检查发生异常",e);
  28. } finally {
  29. //程序结束时,删除临时文件
  30. if (picFile.exists()){
  31. picFile.delete();
  32. }
  33. }
  34. return false;
  35. }

通过后缀名和MIME-TYPE检查实现文件类型校验的更多相关文章

  1. input type="file"指定文件类型为excel

    指定上传类型为excel:加上accept="application/vnd.ms-excel"即可,只兼容chrome跟ff,不兼容ie <input type=" ...

  2. 既然有文件后缀名,为何还需要MIME类型?

    作者:Vincross链接:https://www.zhihu.com/question/60495696/answer/204530120来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...

  3. Linux下的文件及文件后缀名

    Linux下的文件及文件后缀名 2013-03-14 15:34 6969人阅读 评论(0) 收藏 举报 ++++++++++++++++++++++++++++++++++++++正文+++++++ ...

  4. [笔记] C# 如何获取文件的 MIME Type

    MIME Type 为何物: MIME 参考手册 svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types 常规方式 对于有文件后 ...

  5. C#文件后缀名详解

    C#文件后缀名详解 .sln:解决方案文件,为解决方案资源管理器提供显示管理文件的图形接口所需的信息. .csproj:项目文件,创建应用程序所需的引用.数据连接.文件夹和文件的信息. .aspx:W ...

  6. BAT-批量改文件后缀名

    问题现象:在处理一个目录时,发现JPG文件都是以TMP文件命名的.双击打不开.要手动改一个为JPG. 问题处理: 1.新建一个TXT文件,内容写如下: ren *.tmp *.jpg 2.把TXT改为 ...

  7. os模块、文件压缩 、匹配文件后缀名:fnmatch glob

    一.os模块 os模块:是python是系统交互的模块 import os # 0平台信息的一些操作 python是夸平台的,所以内部兼容了不同的平台 1. os.name # 操作系统 nt是win ...

  8. python3批量修改文件后缀名

    import os # 原文件后缀名 suffix_name = '.jar.src.zip' # 新文件后缀名 nwe_suffix_name = '.jar' def foo(path1): fi ...

  9. Android 各种MIME类型和文件类型的匹配表

    MIME:全称Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务.它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后 ...

随机推荐

  1. 在Linux(Centos7)上使用Docker运行.NetCore

    在上一篇中我们写了如何在windows中使用docker运行.netcore,既然我们了解了windows下的运行发布,我们也可以试试linux下使用docker运行.netcore项目,那么今天我们 ...

  2. AppUtils【获取手机的信息和应用版本号、安装apk】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 一个获取设备的系统版本号.设备的型号.应用版本号code值.应用版本号name值.包名.是否更新.安装apk的工具类. 其实这个工具 ...

  3. Java~命名规范

    下面总结以点java命名规范 虽然感觉这些规范比起C#来说有点怪,但还是应该尊重它的命名! 命名规范 项目名全部小写 包名全部小写 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. ...

  4. API接口通讯参数规范

    通常在很多的公司里面,对于接口的返回值没做太大规范,所以会比较常看到各个项目各自定义随意的返回值,比如以下情况: 1. 直接返回bool值(True或者False) 2. 返回void,只要不是异常信 ...

  5. Tensorflow之基于LSTM神经网络写唐诗

    最近看了不少关于写诗的博客,在前人的基础上做了一些小的改动,因比较喜欢一次输入很长的开头句,所以让机器人输出压缩为一个开头字生成两个诗句,写五言和七言诗,当然如果你想写更长的诗句是可以继续改动的. 在 ...

  6. 你所忽略的DNS---DNS实战及深度解读

    很多人没有dns的概念,或者仅仅知道dns负责解析从域名到ip地址,这对普通人来说,也许是够的,但对于开发者来说,就远远不够了. 很多中高级开发者的眼中的DNS是这样的(以百度为例): 读取hosts ...

  7. asp.net后台管理系统-登陆模块-是否自动登陆

    FormsAuthentication.SetAuthCookie(UserFlag, createPersistentCookie); createPersistentCookie是否永久保存coo ...

  8. .NET Framework框架介绍

    1.内容 .net framework c#和.net关系 掌握C#中命名空间2..net 就是微软提供的一个开发平台 版本: vs2008 3.5 vs2010 4.0 vs2012 2013 20 ...

  9. powdesingner 更新数据库表结构

    1.连接数据库 2更新数据库表结构

  10. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...