對於MultipartFile使用tika判斷檔案型別,不會產生臨時檔案的方法

社畜阿藏發表於2020-11-17

使用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();
    }

}

如有問題歡迎指出,萬分感謝

相關文章