欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对于MultipartFile使用tika判断文件类型,不会产生临时文件的方法

程序员文章站 2024-02-19 12:36:04
...

使用tika判断文件类型,不会产生临时文件的方法

因为后缀判断文件不安全,所以最近找了找判断文件类型的其他方法,总结就是使用文件后缀和文件头来判断或者基于tika和文件后缀一同来做文件类型的判断,本次使用tika的方式来做文件类型判断,至于于配合个文件后缀的方法就不写了不是很难,就自己加上吧动动双手成就未来.
首先是依赖
就去maven repository中搜索tika-core就好了
还有一个tika-parsers咱没弄明白他是做什么的如果有了解的大佬可以评论一下
以下就是我的的代码区别就是因为使用springboot我们上传文件一般使用的是MultipartFile
现在网上的一些文章中一般都是使用的是File参数,就是会产生一个问题我需要让MultipartFile转换成File类型,以至于我们会在自己的项目中产生一个临时文件,在我们判断完文件类型之后我们呢还要删除这个临时文件,我看了看大佬们的代码发现其实我们无论怎么做都是要将文件转换成inputstream流的形式然后解析并且判断mimetype
所以我们只需要直接将MultipartFile转换成流的形式就好了,
以下是代码

import org.apache.tika.metadata.HttpHeaders;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaMetadataKeys;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.springframework.web.multipart.MultipartFile;
import org.xml.sax.helpers.DefaultHandler;

import java.io.InputStream;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @auther 社畜阿藏
 */
public class FileTypeConfig {
    /**
     * 获取类型
     * @param file
     * @return
     */
    public static String getMimeType(MultipartFile file) {
        AutoDetectParser parser = new AutoDetectParser();
        parser.setParsers(new HashMap<MediaType, Parser>());
        Metadata metadata = new Metadata();
        metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName());
        try (InputStream stream = file.getInputStream()) {
            parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
        }catch (Exception e){
            throw new RuntimeException();
        }
        return metadata.get(HttpHeaders.CONTENT_TYPE);
    }

    /**
     * 判断是否是图片
     * @param file
     * @return
     */
    public static boolean isImage(MultipartFile file){
        String type = getMimeType(file);
        System.out.println(type);
        //对比对应的文件类型的mime就好了至于不知道对应的是什么的话就百度,百度一定会知道
        Pattern pattern = Pattern.compile("image/.*");
        Matcher m = pattern.matcher(type);
        return m.matches();
    }

}

如有问题欢迎指出,万分感谢