通过后缀名和MIME-TYPE检查实现文件类型校验

前言

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

话不多说,直接上代码

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

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

2.后缀名校验

    /**
     * 文件后缀名校验
     *
     * @param fileName
     *            文件名称
     * @return
     */
    public static boolean suffixCheck(String fileName) {
        if(fileName == null || "".equals(fileName)){
            return false;
        }
        //从最后一个点之后截取字符串
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        //白名单匹配
        boolean anyMatch = Arrays.stream(suffixWhiteList).anyMatch(x -> x.equalsIgnoreCase(suffix));
        return anyMatch;
    }

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

    //MIME-TYPE工具包
    compile("net.sf.jmimemagic:jmimemagic:0.1.3")
    /**
     * MIMETYPE校验
     * @return
     */
    public static boolean mimeTypeCheck(MultipartFile uploadFile){
        if (uploadFile.isEmpty()){
            return false;
        }
        //文件名
        String fileName = uploadFile.getOriginalFilename();
        // 获取文件后缀
        String suffix=fileName.substring(fileName.lastIndexOf("."));
        File picFile = null;
        try {
            // 用uuid作为文件名,防止生成的临时文件重复
            picFile = File.createTempFile(UuidUtils.getUuid(), suffix);
            FileUtils.copyInputStreamToFile(uploadFile.getInputStream(),picFile);
            // MultipartFile to File
            MagicMatch match = Magic.getMagicMatch(picFile, false);
            String mimeType = match.getMimeType();
            // 白名单匹配
            boolean anyMatch = Arrays.stream(mimeTypeWhiteList).anyMatch(x -> x.equalsIgnoreCase(mimeType));
            return anyMatch;

        } catch (IOException e) {
            LOGGER.error("生成临时文件异常",e);
        } catch (Exception  e) {
            LOGGER.error("MIME-TYPE检查发生异常",e);
        } finally {
            //程序结束时,删除临时文件
            if (picFile.exists()){
                picFile.delete();
            }
        }
        return false;
    }

原文地址:https://www.cnblogs.com/beyond-MS/p/10593489.html

时间: 2024-10-17 00:21:18

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

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

作者:Vincross链接:https://www.zhihu.com/question/60495696/answer/204530120来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 下面是正经的科普时间. 文件扩展名是什么? 是操作系统用来标注文件格式的一种机制,用一个点号(.)和主文件名分隔开.由于历史原因,多数扩展名是三个字母. 注意,这里说的是标注,而非定义,既然是标注,说明不是强制的. 比如你用photoshop可以打开一个psd图像文件.把这个文件

[Java]根据文件取得Mime Type的各种方法

1.mime-util: 该工具可以通过 检测文件扩展名,或者检测magic header 两种技术方式来实现mime类型的检测. 比较可靠,而且轻量级.只依赖于slf4j一个包  .2010年后就没有更新了. POM <dependency> <groupId>eu.medsea.mimeutil</groupId> <artifactId>mime-util</artifactId> <version>2.1.3</vers

批量增加后缀名和批量更改后缀名

在debian里可以批量操作文件的后缀名.比如文件没有后缀名,那么就加一个后缀名,或者改变已有的后缀名. 增加后缀名: 当前目录里的所有文件后缀都变为.xml 方法1: find . -type f -exec mv {} {}.xml ';' 方法2: rename 's/$/\.xml/' * 更改后缀名: rename 's/.xml/.txt/' * 删除后缀名: rename 's/.txt//' *

Java:搜索特定后缀名的文件

写了个Java程序,以特定后缀名为条件,在指定目录内递归搜索文件,再生成文件列表. 1 import java.io.File; 2 import java.util.ArrayList; 3 import java.util.List; 4  5 public class FileListGenerator { 6  7     // FileList类可寻找指定路径下所有指定文件后缀名的文件,并生成文件列表 - List<File> 8  9     FileListGenerator(F

BAT-批量改文件后缀名

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

Android 中文件类型与MIME的匹配表(转)

背景介绍: MIME:全称Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务.它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器.MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开.多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式. 在Android中通过文件的MIME类型来判断有哪些应用程序可以处理这些文

关于PHP HTML &lt;input type=&quot;file&quot; name=&quot;img&quot;/&gt;上传图片,图片大小,宽高,后缀名。

在我们的系统中,不免要上传图片,视频等文件,在上传中,需要做的一些判断,文件大小等方面. 注意: 在php.ini 中的post_max_size,upload_max_filesize默认为2M,在上传视频的时候,需要修改下,可以自行设置. 另外如果启用了内存限制,那么该值应当小于memory_limit选项的值. 在上传视频的时候,可以会需要花费些时间,当超过一定的时间,会报脚本执行超过30秒的错误,这是因为在php.ini配置文件中max_execution_time配置选项在作怪,其表示

Python - 多次检查后缀名(endwith)

在通过后缀名查找类型文件的时候, 多次使用endwith, 使用元组(tuple), 简化操作. 此类方式, 也可以应用于if语句多次相似检测. 代码 # 列出文件夹内所有代码 def list_dictionary_codes(root_dir): paths_list = [] for parent, dirNames, fileNames in os.walk(root_dir): for name in fileNames: ext = ['.h', '.m', '.xib', '.js

MIME TYPE

什么是 MIME TYPE? MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开.多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式. 它是一个互联网标准,扩展了电子邮件标准,使其能够支持: 非ASCII字符文本:非文本格式附件(二进制.声音.图像等):由多部分(multiple parts)组成的消息体:包含