基于tika实现对文件类型进行判断


判断文件类型一般可采用两种方式

1. 后缀名判断

简单易操作,但无法准确判断类型

2. 文件头信息判断

通常可以判断文件类型,但有些文件类型无法判断(如word和excel头信息的前几个字节是一样的,无法判断)

使用tika就可轻松解决这两种方式存在的问题

首先要做的就是导入tika的包坐标

  <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>1.24.1</version>
        </dependency>

具体实现

package hkyxg.education.util;

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;


public class FileTypeUtil {
    private static Pattern pattern = Pattern.compile("image/.*");
    private static Pattern pattern2 = Pattern.compile("application/pdf");
    /**
     * 获取类型
     * @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就好了
        Matcher m = pattern.matcher(type);
        return m.matches();
    }
    public static boolean isPdf(MultipartFile file){
        String type = getMimeType(file);
        System.out.println(type);
        Matcher m = pattern2.matcher(type);
        return m.matches();
    }
}

tika是通过文件流来对文件类型进行判断的,与其他两种方式相比更加安全,方法也比较简单。

一些常见的mime type类型

image/bmp
image/x-bitmap
image/x-pixmap
image/jpg
image/png
image/jpeg
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
application/x-rar-compressed
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
application/zip zip
image/tiff tiff
image/bmp bmp
application/rtf rtf
application/x-tika-ooxml xls
application/x-bplist pdf
application/pdf
application/vnd.ms-word.document.macroenabled.12 docm
image/gif
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
application/x-tika-msoffice pdf
application/msword
application/x-7z-compressed 7z
application/vnd.ms-xpsdocument xps

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值