精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot 整合 Apache Tika 實現文件類型檢測與內容提取

開發 前端
在實際開發中,我們經常需要處理各類文件(如PDF、Word、Excel、圖片等),核心需求包括識別文件真實類型(避免后綴名欺騙)和提取文件內容/元數據(如文檔正文、創建時間、作者)。Apache Tika作為Apache基金會的開源項目,能高效解決這些問題,且無需手動編寫不同格式的解析邏輯。

前言

在實際開發中,我們經常需要處理各類文件(如PDF、Word、Excel、圖片等),核心需求包括識別文件真實類型(避免后綴名欺騙)和提取文件內容/元數據(如文檔正文、創建時間、作者)。Apache Tika作為Apache基金會的開源項目,能高效解決這些問題,且無需手動編寫不同格式的解析邏輯。

核心概念

在整合前,先明確Tika3個核心組件,理解其工作原理:

  • Detector(檢測器):負責識別文件的真實類型,支持通過文件頭、字節流、擴展名等多維度檢測,避免 “后綴名篡改” 導致的類型誤判。
  • Parser(解析器):根據Detector識別的文件類型,調用對應的解析器提取文件內容(如文本)和元數據(如文件大小、修改時間),Tika內置了PDF、Office、XML等格式的解析器。
  • Metadata(元數據):存儲文件的結構化信息,分為內置元數據(如Metadata.CONTENT_ENCODINGMetadata.CONTENT_TYPE)和自定義元數據(如文檔作者、版本號)。

案例

依賴添加

Tika依賴較多解析庫(如POI、PDFBox),可能與項目中已有的依賴沖突(如POI版本不一致),手動排除即可。

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

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers-standard-package</artifactId>
    <version>2.9.2</version>
</dependency>

配置 Tika Bean

為避免重復創建Tika實例(提升性能),支持自定義配置(如超時時間、解析器優先級):

@Configuration
public class TikaSelfConfig {

    /**
     * 全局Tika實例(用于文件類型檢測)
     */
    @Bean
    public Tika tika() throws TikaException, IOException, SAXException {
        // 自定義Tika配置:設置文件類型檢測超時時間(5秒)
        TikaConfig config = new TikaConfig();
        return new org.apache.tika.Tika(config) {
            @Override
            public String detect(java.io.InputStream stream, Metadata metadata) {
                try {
                    // 超時控制:避免解析超大文件阻塞
                    return super.detect(new TimeoutInputStream(stream, 5000), metadata);
                } catch (IOException e) {
                    throw new RuntimeException("文件類型檢測超時(超過5秒)", e);
                }
            }
        };
    }

    /**
     * 自動檢測解析器(用于內容提取)
     */
    @Bean
    public Parser autoDetectParser() {
        // AutoDetectParser會根據文件類型自動選擇解析器
        return new AutoDetectParser();
    }

    // 注冊自定義解析器(在TikaConfig中添加)
    @Bean
    public Parser customParser() {
        return new CustomCsvParser();
    }
}


public class TimeoutInputStream extends InputStream {
    private final InputStream delegate;
    private final long timeoutMillis;
    private long lastReadTime;

    public TimeoutInputStream(InputStream delegate, long timeoutMillis) {
        this.delegate = delegate;
        this.timeoutMillis = timeoutMillis;
        this.lastReadTime = System.currentTimeMillis();
    }

    @Override
    public int read() throws IOException {
        checkTimeout();
        int data = delegate.read();
        if (data != -1) {
            lastReadTime = System.currentTimeMillis();
        }
        return data;
    }

    private void checkTimeout() throws IOException {
        long elapsed = System.currentTimeMillis() - lastReadTime;
        if (elapsed > timeoutMillis) {
            throw new IOException("Stream read timeout (elapsed: " + elapsed + "ms)");
        }
    }

    // 重寫其他read方法(read(byte[]), read(byte[], int, int)),邏輯類似
}

功能 1:文件類型檢測

@Service
public class TikaFileDetectService {

    private final Tika tika;

    // 注入全局Tika Bean
    public TikaFileDetectService(Tika tika) {
        this.tika = tika;
    }

    /**
     * 1. 基于MultipartFile(文件流)檢測真實類型(推薦)
     * @param file 上傳的文件
     * @return 真實MIME類型(如image/jpeg、application/pdf)
     */
    public String detectFileByStream(MultipartFile file) throws IOException {
        if (file.isEmpty()) {
            throw new IllegalArgumentException("文件不能為空");
        }

        // 元數據:可添加文件名輔助檢測(非必需,但能提升準確率)
        Metadata metadata = new Metadata();
        metadata.add(TikaCoreProperties.RESOURCE_NAME_KEY, file.getOriginalFilename());

        // 通過文件流檢測(Tika會讀取文件頭字節,不依賴后綴名)
        try (InputStream inputStream = file.getInputStream()) {
            return tika.detect(inputStream, metadata);
        }
    }

    /**
     * 2. 基于字節數組檢測(適用于小文件/內存中的文件)
     * @param bytes 文件字節數組
     * @param fileName 文件名(輔助檢測)
     * @return 真實MIME類型
     */
    public String detectFileByBytes(byte[] bytes, String fileName) {
        if (bytes == null || bytes.length == 0) {
            throw new IllegalArgumentException("字節數組不能為空");
        }

        return tika.detect(bytes, Metadata.TIKA_MIME_FILE);
    }

    /**
     * 3. 基于擴展名檢測(僅作輔助,準確率低)
     * @param fileName 文件名(如test.pdf)
     * @return 推測的MIME類型
     */
    public String detectFileByExtension(String fileName) {
        return tika.detect(fileName);
    }
}

功能 2:文件內容與元數據提取

@Service
public class TikaContentExtractService {

    private final Parser autoDetectParser;

    // 注入自動檢測解析器
    public TikaContentExtractService(Parser autoDetectParser) {
        this.autoDetectParser = autoDetectParser;
    }

    /**
     * 提取文件的文本內容(支持PDF、Word、Excel等)
     * @param file 上傳的文件
     * @return 提取的純文本
     */
    public String extractText(MultipartFile file) throws Exception {
        if (file.isEmpty()) {
            throw new IllegalArgumentException("文件不能為空");
        }

        // 1. 內容處理器:BodyContentHandler用于接收文本內容,設置容量(避免大文件OOM)
        ContentHandler contentHandler = new BodyContentHandler(10 * 1024 * 1024); // 10MB上限

        // 2. 元數據:存儲文件的結構化信息
        Metadata metadata = new Metadata();
        metadata.add(TikaCoreProperties.RESOURCE_NAME_KEY, file.getOriginalFilename());

        // 3. 解析上下文:用于傳遞解析器所需的額外信息(如密碼,適用于加密文件)
        ParseContext parseContext = new ParseContext();
        parseContext.set(Parser.class, autoDetectParser); // 綁定當前解析器

        // 4. 解析文件并提取內容
        try (InputStream inputStream = file.getInputStream()) {
            autoDetectParser.parse(inputStream, contentHandler, metadata, parseContext);
            return contentHandler.toString();
        }
    }

    /**
     * 提取文件的元數據(如創建時間、作者、文件大小)
     * @param file 上傳的文件
     * @return 元數據鍵值對(格式化輸出)
     */
    public String extractMetadata(MultipartFile file) throws Exception {
        Metadata metadata = new Metadata();
        ParseContext parseContext = new ParseContext();
        parseContext.set(Parser.class, autoDetectParser);

        try (InputStream inputStream = file.getInputStream()) {
            autoDetectParser.parse(inputStream, new BodyContentHandler(), metadata, parseContext);
        }

        // 格式化元數據輸出(遍歷所有元數據鍵)
        StringBuilder metadataStr = new StringBuilder();
        for (String name : metadata.names()) {
            metadataStr.append(name).append(": ").append(metadata.get(name)).append("\n");
        }
        return metadataStr.toString();
    }


    /**
     * 提取加密文件的文本內容(支持PDF、Word、Excel等)
     * @param file 上傳的文件
     * @return 提取的純文本
     * 1. 對舊版 Office 文檔(.doc、.xls),使用 POI 的 EncryptionInfo 和 Decryptor 直接解密
     * 2. 對新版 Office 文檔(.docx、.xlsx),仍使用 Tika 的 PasswordProvider
     */
    public String extractEncryptedText(MultipartFile file, String password) throws Exception {
        ContentHandler handler = new BodyContentHandler();
        Metadata metadata = new Metadata();
        metadata.add(TikaCoreProperties.RESOURCE_NAME_KEY, file.getOriginalFilename());
        metadata.set("password", password);

        AutoDetectParser autoDetectParser = new AutoDetectParser();
        ParseContext context = new ParseContext();
        context.set(PasswordProvider.class,metadata1 -> password);
        try (InputStream inputStream = file.getInputStream()) {
            autoDetectParser.parse(inputStream, handler, metadata, context);
            return handler.toString();
        }
    }
}

功能 3:自定義解析器

// 自定義解析器:處理.csv格式文件(示例,Tika已內置CSV解析器,此處僅演示擴展)
public class CustomCsvParser extends AbstractParser {

    // 聲明支持的MIME類型
    @Override
    public Set<MediaType> getSupportedTypes(ParseContext context) {
        return Collections.singleton(MediaType.parse("text/csv"));
    }

    // 核心解析邏輯
    @Override
    public void parse(InputStream stream, ContentHandler handler, Metadata metadata, ParseContext context)
            throws IOException, SAXException {
        // 1. 設置CSV文件的元數據
        metadata.add("file_format", "CSV");
        metadata.add("delimiter", ",");

        // 2. 讀取CSV內容并寫入ContentHandler
        String csvContent = readInputStreamAsString(stream);
        handler.characters(csvContent.toCharArray(), 0, csvContent.length());
    }

    private String readInputStreamAsString(InputStream inputStream) throws IOException {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        int nRead;
        byte[] data = new byte[1024];
        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }
        buffer.flush();
        return new String(buffer.toByteArray(), StandardCharsets.UTF_8);
    }
}

測試代碼

圖片圖片

@Test
    public void tikaFile() throws Exception {
        File fakeImageFile = new File("D:\\文檔\\自動巡檢腳本部署說明.docx");
        MultipartFile mockFile = new MockMultipartFile("file",new FileInputStream(fakeImageFile));
        System.out.println(tikaContentExtractService.extractText(mockFile));
        System.out.println(tikaContentExtractService.extractMetadata(mockFile));
//        System.out.println(tikaContentExtractService.extractEncryptedText(mockFile,"123456"));
    }


責任編輯:武曉燕 來源: 一安未來
相關推薦

2025-01-02 11:01:13

Apache文件類型部署

2025-03-31 08:43:34

SpringTika優化

2025-09-10 09:31:04

2017-04-17 10:35:40

Spring BooRedis 操作

2009-11-16 12:17:46

PHP上傳文件類型

2025-09-08 04:07:00

SpringApache工具

2022-08-24 08:42:59

Minio存儲Golang

2024-10-14 13:26:42

2024-10-31 09:42:08

2009-08-12 16:44:13

.NET文件類型

2023-10-12 10:32:51

2010-03-10 09:27:36

Linux鏈接文件類型

2010-01-05 15:32:33

2010-03-01 15:34:38

Linux文件類型

2025-03-26 03:25:00

SpringGuavaCaffeine

2024-11-11 10:02:37

Spring搜索數據

2025-07-02 07:33:02

Spring倒排索引分布式

2025-05-09 07:20:02

Spring數據庫檢索

2022-12-23 08:28:42

策略模式算法

2009-10-21 10:50:59

Linux文件類型
點贊
收藏

51CTO技術棧公眾號

天天做综合网| 国产一区二区主播在线| 国产91精品一区二区| 久久久久久这里只有精品| 少妇激情一区二区三区视频| 手机av在线| 日本一区二区三区四区| 97se亚洲综合| 国产第一页在线观看| 中文无码久久精品| 精品无码久久久久久国产| 亚洲免费黄色网| 俄罗斯一级**毛片在线播放| 国产日本欧美一区二区| 97超级碰碰| 亚洲 欧美 日韩 在线| 中文字幕日韩一区二区不卡| 日韩电影视频免费| 国产免费中文字幕| 亚洲同志男男gay1069网站| 中文字幕在线视频一区| 国产亚洲第一区| 一级黄色大片免费| 免费看黄裸体一级大秀欧美| 欧美成人小视频| 国产1区2区在线观看| 成人涩涩网站| 在线不卡免费av| 男人亚洲天堂网| av毛片午夜不卡高**水| 亚洲人成人一区二区在线观看| 蜜桃av色综合| 日韩在线观看视频一区| 狠狠色2019综合网| 国产精品成人一区二区| 日韩免费一二三区| 欧美96在线丨欧| 日韩中文字幕在线视频播放| 91成人破解版| 色天天色综合| 亚洲国产精品一区二区三区| 潘金莲一级淫片aaaaaaa| 欧美91在线|欧美| 日本高清视频一区二区| 日本a视频在线观看| 性欧美video高清bbw| 中文字幕五月欧美| 亚洲三区在线| 成人全视频高清免费观看| 2014亚洲片线观看视频免费| 国产自产精品| 午夜福利视频一区二区| 成人视屏免费看| 3d蒂法精品啪啪一区二区免费| 一女二男一黄一片| 免费看黄色91| 成人h片在线播放免费网站| 中文字幕一区二区三区四区视频| 久久久久久久波多野高潮日日| 91av在线看| 国产成人在线观看网站| 国产欧美一级| 欧美伊久线香蕉线新在线| 欧美成人精品欧美一级乱黄| 日韩香蕉视频| 456亚洲影院| 无码无套少妇毛多18pxxxx| 久久午夜电影| 国产精品久久久久久一区二区| 国产精品熟女视频| 日本欧美在线看| 成人国产精品免费视频| www.激情五月.com| 成人精品视频一区二区三区尤物| 国产精品日本一区二区 | 91在线网址| 中文字幕免费在线观看视频一区| 亚洲国产一区在线| 免费黄色网页在线观看| 夜夜精品浪潮av一区二区三区| 亚洲精品少妇一区二区| 国产在线看片免费视频在线观看| 亚洲国产日韩一区二区| 男人日女人bb视频| 777午夜精品电影免费看| 欧美精品免费视频| 亚洲av成人片无码| 羞羞答答一区二区| 中文字幕日韩专区| 草视频在线观看| 99在线热播精品免费99热| 国产成人精品日本亚洲| 国产日韩精品suv| 99视频精品在线| 日韩av高清在线播放| 国产黄a三级三级三级av在线看| 亚洲一区二区欧美日韩| 精品www久久久久奶水| 国产精品视频一区二区三区综合| 日韩电影免费观看中文字幕| 神马午夜精品91| 亚洲精品美女| 国产精品专区一| 天堂在线视频免费观看| 中文字幕精品—区二区四季| 国产乱人伦精品一区二区三区| 欧美xxx网站| 日韩欧美国产三级| 久久久久亚洲AV成人无在| 激情亚洲成人| 国产在线精品播放| 日韩欧美亚洲系列| 亚洲视频香蕉人妖| 日韩在线xxx| 99精品中文字幕在线不卡| 在线中文字幕日韩| 97超碰人人干| 国产成人免费在线视频| 亚洲精品日韩精品| 天堂中文最新版在线中文| 欧美一区二区视频网站| 国产一级久久久久毛片精品| 亚洲国产日本| 18成人免费观看网站下载| 1769视频在线播放免费观看| 欧美日韩一区二区三区在线免费观看| 天天操夜夜操很很操| 成人激情电影在线| 91高清免费在线观看| 亚洲大尺度视频| 中文字幕一区二区视频| 超碰在线97免费| 九九视频精品全部免费播放| 国内自拍欧美激情| 亚洲国产精品suv| 亚洲男人的天堂在线观看| www.com黄色片| 精品一区亚洲| 国产999在线观看| 嫩草研究院在线| 欧美日韩在线视频观看| 在线免费播放av| 尤物精品在线| 国产另类第一区| 啦啦啦中文在线观看日本| 日韩一区二区免费在线观看| 欧美一级片在线视频| 久久se精品一区精品二区| 日韩视频专区| jizz免费一区二区三区| 伊人亚洲福利一区二区三区| 亚洲 欧美 日韩 在线| 久久精品亚洲精品国产欧美kt∨ | 污的网站在线观看| 制服.丝袜.亚洲.另类.中文| 欧美一级片在线视频| 国产一区二区三区精品欧美日韩一区二区三区 | 奴色虐av一区二区三区| 久久久久亚洲综合| 可以在线看的黄色网址| 国产成人调教视频在线观看| 国产精品成人av在线| 日韩三级影院| 欧美精品 国产精品| 18岁成人毛片| 成人av在线一区二区| 免费一级特黄特色毛片久久看| 亚洲成a人片| 日韩中文字在线| 国产成人久久精品77777综合| 亚洲综合视频网| 国产精品久久无码| 老**午夜毛片一区二区三区| 亚洲国产日韩美| 只有精品亚洲| 97精品国产aⅴ7777| 五月天婷婷在线播放| 91黄色小视频| 国产真实乱在线更新| 99热这里都是精品| 精品久久久久av| 91精品1区| 国产精品三区www17con| 久久久人成影片一区二区三区在哪下载| 中文字幕精品久久久久| 国产高潮在线观看| 天天av天天翘天天综合网| 欧美性受xxxx黑人| 国产电影一区在线| 欧美成人精品欧美一级乱| 99久久影视| 久久av免费观看| 日韩一区二区三免费高清在线观看| 九色91av视频| 国产黄在线播放| 欧美一卡2卡3卡4卡| 精品国产午夜福利| 亚洲视频一区二区在线观看| 国产熟妇搡bbbb搡bbbb| 国产在线视频精品一区| www.av中文字幕| 99久久影视| 久久伊人资源站| 久久免费精品| 国产精品69久久| 国产美女情趣调教h一区二区| 亚洲香蕉成视频在线观看 | 亚洲精品v欧美精品v日韩精品| 免费一级a毛片| 亚洲福利视频一区| 国产黄色录像片| 久久中文娱乐网| 久久黄色一级视频| 免费人成网站在线观看欧美高清| 欧美日韩性生活片| 在线国产一区二区| 亚洲成色最大综合在线| 欧美大片网址| 98国产高清一区| 欧美伊人亚洲伊人色综合动图 | 国产一区二区三区四区五区3d| 久久人人爽国产| 精品视频在线一区二区| 亚洲网在线观看| 天堂在线中文字幕| 日韩美女主播在线视频一区二区三区| 亚洲午夜在线播放| 一本高清dvd不卡在线观看| 久久久久久久久久久久久久久久久| 国产精品女上位| 90岁老太婆乱淫| 91丝袜国产在线播放| 午夜免费福利影院| 国产精品中文字幕一区二区三区| 日韩欧美国产片| 奇米精品一区二区三区在线观看一 | 91啪国产在线| 国产精品99精品一区二区三区∴| 日韩免费观看在线观看| 亚洲天堂av在线| 欧亚精品中文字幕| 黄色软件视频在线观看| 久久久久久久成人| 黄污视频在线观看| 久久久久中文字幕| 狂野欧美性猛交xxxxx视频| 美女av一区二区| 18网站在线观看| 欧美成人精品三级在线观看| 99热国产在线| 欧美日韩第一页| 激情网站在线| 久久久视频在线| 欧美aa在线| 国产不卡av在线| 成人网ww555视频免费看| 国产91精品网站| 992tv国产精品成人影院| 国产精品久久久久不卡| 国产极品久久久久久久久波多结野| 国产精品国产三级国产aⅴ浪潮| 在线看欧美视频| 精品国产三区在线| 国产日韩视频在线观看| 黄色成人小视频| 91在线网站视频| 波多野结衣一区二区三区免费视频| 国产精品久久久对白| 欧美人成在线观看ccc36| 免费国产一区二区| 成人激情开心网| 国产女主播av| 99热在线精品观看| 日韩在线第三页| 国产一区二区三区精品视频 | 91一区在线观看| 一级片手机在线观看| 国产精品毛片无遮挡高清| 91插插插插插插| 精品久久在线播放| 国产成人a v| 欧美一区二区三区播放老司机| 日本免费不卡视频| 国产一区二区三区视频| 黄色网在线播放| 77777少妇光屁股久久一区| 第四色男人最爱上成人网| 92国产精品久久久久首页 | 精品国产91久久久久久久妲己| 亚洲欧洲成人在线| 色偷偷综合社区| bl视频在线免费观看| 国产精品久久久久久久久久尿| 国产专区精品| 久久影院理伦片| 午夜国产精品视频| 十八禁视频网站在线观看| 国产乱码一区二区三区| 久久亚洲AV成人无码国产野外| 国产精品成人在线观看 | 欧洲精品中文字幕| 亚洲国产精品视频在线| 伊人一区二区三区久久精品| 国产丝袜视频在线播放| 国产区精品视频| 天天躁日日躁狠狠躁欧美| 色中文字幕在线观看| 久久天天综合| 亚洲高清无码久久| 亚洲欧洲日本在线| 国产一级一级国产| 欧美tickling网站挠脚心| 日韩欧美小视频| 国产成人一区二区三区| 成人另类视频| 黑人巨茎大战欧美白妇| 日韩国产在线一| 一级欧美一级日韩片| 亚洲欧美电影一区二区| 亚洲欧美日韩一区二区三区四区| 亚洲国产精品久久久久| 黄视频网站在线| 国产精品久久中文| 欧美调教在线| 久久久久99精品成人片| 激情综合色播五月| 网爆门在线观看| 日本韩国欧美在线| 日本v片在线免费观看| 高清视频欧美一级| 免费欧美网站| 自拍偷拍亚洲色图欧美| 日韩电影在线观看网站| 尤物视频最新网址| 色欧美日韩亚洲| 欧美视频综合| 欧美综合第一页| 日韩超碰人人爽人人做人人添| 久草视频这里只有精品| 国产精品88av| 久久久久久久久久久97| 日韩免费观看高清完整版 | 日本欧美中文字幕| 香蕉久久夜色精品国产更新时间 | 日本成人在线视频网站| 深爱五月激情网| 日本韩国一区二区三区| 免费看男男www网站入口在线 | 日韩精品一区二区三区电影| 韩国午夜理伦三级不卡影院| 黄色录像一级片| 欧美一区二区三区不卡| 四季久久免费一区二区三区四区| 5566av亚洲| 欧美日韩国产探花| 亚洲色图欧美日韩| 天天色综合天天| 国产一级二级三级在线观看| 国产精品精品久久久| 欧美激情成人| 色欲无码人妻久久精品| 亚洲一二三专区| 日本福利午夜视频在线| 国产成人精品久久亚洲高清不卡| 日韩.com| 日本在线视频播放| 亚洲国产一区二区在线播放| 婷婷在线观看视频| 国产成人精品免费视频| 国产大片一区| 动漫美女无遮挡免费| 欧美性生交xxxxx久久久| 国产黄色在线| 亚洲一区亚洲二区亚洲三区| 影音先锋亚洲电影| 少妇毛片一区二区三区| 欧美色中文字幕| 四虎影院观看视频在线观看| 女同一区二区| 九九九久久久精品| 免费在线看黄网址| 亚洲九九九在线观看| 久久久加勒比| 成人黄色av片| 中文字幕电影一区| 亚洲黄色小说网| 国产va免费精品高清在线观看 | 男女视频网站在线观看| 亚洲国产高清aⅴ视频| 亚洲av无码国产精品久久不卡| 欧美一区亚洲一区| 一区二区三区午夜视频| 亚洲一区二区三区无码久久| 欧美丝袜丝交足nylons图片| 男女羞羞视频在线观看| 亚洲成人蜜桃| 成人精品视频一区| 国产一区二区三区视频免费观看| 97在线视频精品| 亚洲一区二区日韩|