精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品成人国产| eeuss影院一区二区三区| 亚洲片在线资源| 国产亚洲精品久久飘花| 青青操国产视频| 亚洲自拍偷拍另类| 电影一区二区三区久久免费观看| 亚洲欧美一区二区三区极速播放| 91在线看国产| 日韩一区二区免费电影| 一二三四视频社区在线| 女人和拘做爰正片视频| 国产网站在线看| 国产精品传媒麻豆hd| 亚洲一卡二卡三卡四卡五卡| 国产经品一区二区| 免费看一级一片| 91蝌蚪精品视频| 欧美色国产精品| 国产美女在线一区| 五月婷婷中文字幕| 亚洲精品小说| 亚洲国产精品大全| 日本中文字幕片| 成年网站在线视频网站| 综合精品一区| 亚洲视频电影图片偷拍一区| 中文字幕在线播放一区二区| 国产欧洲在线| 久久综合九色综合欧美就去吻| 91青草视频久久| 五月天激情国产综合婷婷婷| 亚洲最新色图| 欧美日韩性在线观看| 成人美女在线视频| 成人av色在线观看| 能免费看av的网站| 少妇高潮一区二区三区99| 日韩欧美亚洲一二三区| 大伊香蕉精品视频在线| 亚洲s色大片| 久久久久久久性| 久久国产精品久久精品国产| 性一交一乱一乱一视频| 日韩精品一区二区久久| 亚洲激情第一页| 免费一区二区三区在线观看 | 欧美高清电影在线看| 精品无码一区二区三区| 日韩av中文字幕一区| 日韩久久久久久| 成人av毛片在线观看| 另类一区二区三区| 午夜不卡av免费| 性欧美大战久久久久久久| 国产在线xxx| 国产精品久久一级| 久久精品一区二区三区av| 久久精品视频网站| 亚洲精品久久久久久国| 超碰在线cao| 欧美日韩精品二区| 97超碰在线视| 黄网av在线| 亚洲aaa精品| 日韩欧美视频一区二区三区四区| 国产美女裸体无遮挡免费视频| 99成人在线| 国模私拍视频一区| 日本熟妇色xxxxx日本免费看| 不卡一区综合视频| 欧美精品在线观看一区二区| 日韩视频在线免费看| 亚洲第一影院| 欧美日韩精品一区二区| 亚洲男人天堂av在线| 国产毛片av在线| 中文字幕一区三区| 亚洲精品国产精品国自产| 欧美另类自拍| 成人免费在线播放视频| 五月天色一区| 鲁一鲁一鲁一鲁一澡| 国模私拍视频在线| 不卡的av在线播放| 欧美在线播放一区| 成年人在线观看| 中文字幕中文字幕一区二区| 国产精品久久成人免费观看| 日本视频在线观看| 国产欧美视频在线观看| 日本电影一区二区三区| 无遮挡的视频在线观看| 一区二区三区在线观看视频 | 影音先锋亚洲精品| 国产91精品青草社区| 日韩人妻精品中文字幕| 精品一区二区成人精品| 91免费在线观看网站| 天堂中文在线看| 国产精品成人免费在线| 久久观看最新视频| 极品在线视频| 91精品国产福利在线观看| 欧美人成在线观看| 成人黄色免费观看| 亚洲.国产.中文慕字在线| 99草草国产熟女视频在线| 欧美久久亚洲| 亚洲人在线视频| 久久久久久蜜桃| 久久99国产综合精品免费| 久久在线视频| 97视频在线看| 国产精品一级视频| 久久人人爽爽爽人久久久| 红桃一区二区三区| 欧美日韩尤物久久| 亚洲成年网站在线观看| 国产91丝袜美女在线播放| 婷婷久久综合| 欧美在线视频导航| 中文字幕91爱爱| 不卡电影一区二区三区| 看全色黄大色大片| 欧美男男tv网站在线播放| 欧美亚洲国产一区在线观看网站 | 国产一区二区三区观看| 88xx成人精品| 亚洲精选一区二区三区| 成人精品国产一区二区4080| 99精品国产高清一区二区| 992tv免费直播在线观看| 岛国av一区二区在线在线观看| 一级黄色免费毛片| 奇米狠狠一区二区三区| 色yeye香蕉凹凸一区二区av| 在线观看亚洲天堂| 波多野结衣精品在线| 小泽玛利亚av在线| 视频欧美精品| 亚洲第一网站男人都懂| 久久免费在线观看视频| 国产精品刘玥久久一区| 99久久777色| 日韩视频在线视频| 麻豆一二三区精品蜜桃| 久久视频在线直播| 可以免费看的av毛片| 99久久婷婷国产综合精品| 噜噜噜噜噜久久久久久91| 日本片在线观看| 欧美一区二区视频在线观看2020 | 精品久久美女| 国产精品九九久久久久久久| 精品推荐蜜桃传媒| 欧美日韩国产专区| 毛茸茸free性熟hd| 麻豆changesxxx国产| 91日韩视频| 国产欧美在线播放| 精品视频在线一区二区| 欧美一区在线视频| 成人免费黄色小视频| 蜜桃一区二区三区四区| 亚洲午夜高清视频| 日韩漫画puputoon| 久久久999国产精品| aaa一区二区三区| 亚洲午夜三级在线| 成年人在线观看av| 日韩一区精品字幕| 亚洲国产午夜伦理片大全在线观看网站 | 国模一区二区三区白浆| 91社在线播放| 成人自拍在线| 日本成人在线视频网址| 在线毛片网站| 日韩美一区二区三区| 午夜毛片在线观看| 国产精品三级av在线播放| 一级网站在线观看| 亚洲综合婷婷| 久久免费看少妇高潮| 亚洲国产高清国产精品| 日韩免费在线电影| 日韩在线观看网站| 亚洲大尺度网站| 日本精品一级二级| 亚洲天堂黄色片| 国内精品在线播放| 欧美在线观看成人| 国产精品久久久久久久免费观看| 国产超碰91| 台湾佬成人网| 欧美激情手机在线视频 | 亚洲天堂狠狠干| 亚洲自拍与偷拍| 中文字幕av久久爽一区| 国产99精品国产| 亚洲男人天堂色| 国产精品99一区二区| 视频一区二区三区在线观看| 无码国模国产在线观看| 国产suv精品一区二区| 亚洲电影视频在线| 日韩久久精品电影| 国产精品第6页| 久久久久久久欧美精品| 欧美久久久一区| 伊人久久久久久久久久久久久久| 日韩国产在线观看一区| 日本手机在线视频| 欧美.www| 国产高清精品一区二区三区| 亚洲a成人v| 日本在线观看天堂男亚洲| 亚洲小说区图片区都市| 在线成人一区二区| 色视频精品视频在线观看| 正在播放一区二区| 成人精品在线看| 亚洲精品美腿丝袜| 欧美a在线播放| 国产在线不卡一卡二卡三卡四卡| 日韩精品在线中文字幕| 婷婷久久国产对白刺激五月99| 日本婷婷久久久久久久久一区二区 | 亚洲成av人片观看| 欧美日韩午夜视频| 国产精品天干天干在线综合| 久久久久久国产精品无码| 99热国产精品| 久久综合在线观看| 久久精品国产99| 天堂社区在线视频| 免费欧美日韩| 欧美成人xxxxx| 亚洲电影在线| 亚洲不卡中文字幕无码| 禁久久精品乱码| 人妻少妇精品无码专区二区| 激情av一区| 免费看欧美黑人毛片| 欧美午夜不卡| 国产一区二区三区小说| 黑丝一区二区三区| 欧美国产综合在线| 亚洲一级高清| 日日碰狠狠添天天爽超碰97| 亚洲精品一级| 国产乱子伦农村叉叉叉| 国产农村妇女精品一区二区| 欧美牲交a欧美牲交| 欧美成熟视频| 久青草视频在线播放| 亚洲视频观看| 日韩av资源在线| 日本不卡在线视频| 欧美一级日韩不卡播放免费| 天天干中文字幕| 亚洲黄色小说网站| 欧美乱大交做爰xxxⅹ小说| 91免费国产在线观看| 久久午夜夜伦鲁鲁片| 久久久久国产精品人| 国产制服丝袜在线| 久久奇米777| 精品一区二区三孕妇视频| 中文字幕亚洲不卡| 国产精品成人免费观看| 亚洲国产一二三| 日韩综合在线观看| 欧美精品一卡两卡| 欧美特级特黄aaaaaa在线看| 日韩精品极品在线观看播放免费视频| 欧美xxx.com| 久久精品影视伊人网| 国产福利在线播放麻豆| 欧美成人精品一区二区| 欧美成人高清在线| 久久全球大尺度高清视频| 欧美男体视频| 91精品视频播放| 任你躁在线精品免费| 亚洲一区二区三区在线观看视频| 欧美老女人另类| 日韩黄色影视| 亚洲精品小说| 亚洲成熟丰满熟妇高潮xxxxx| 久久精品久久精品| 欧类av怡春院| 中文字幕一区免费在线观看| 69xx绿帽三人行| 色天天综合色天天久久| 亚洲欧美精品一区二区三区| 欧美区视频在线观看| 蜜桃av噜噜一区二区三区麻豆| 亚洲人成免费电影| 欧美日韩在线看片| 欧美成aaa人片在线观看蜜臀| 在线观看欧美日韩电影| 91免费精品视频| 视频精品在线观看| 日韩精品在线中文字幕| 久久国产精品区| 在线免费观看日韩av| 亚洲人成在线播放网站岛国| 日本一级淫片色费放| 欧美一区三区二区| 精品电影在线| 97色在线视频观看| 日韩精品三级| 在线播放豆国产99亚洲| 视频一区中文字幕国产| 岛国大片在线免费观看| 国产精品美女一区二区| 日本特黄一级片| 久久久久久美女精品| 国产精品久久97| 香蕉精品久久| www.av片| 国产激情一区二区三区| 四虎永久免费地址| 欧美色网一区二区| 少妇激情av一区二区| 久久国产精品久久国产精品| ww久久综合久中文字幕| 欧美大陆一区二区| 狠狠爱成人网| 亚洲最大视频网| 一区二区三区久久久| 久久久久久久久久成人| 亚洲男人天堂久| 天堂av中文在线观看| 狠狠综合久久av| 国产亚洲精品久久久久婷婷瑜伽| 国产在线观看免费播放| 一区二区三区不卡视频在线观看| 一级做a爰片久久毛片16| 中文综合在线观看| 成人在线免费av| 一本色道久久综合亚洲精品婷婷 | 小早川怜子一区二区三区| 国产精品网站在线观看| 中文字幕乱码中文字幕| 国产亚洲激情在线| av成人免费看| 亚洲精品一区二区三| 久久久www| 黄色三级生活片| 欧美丰满高潮xxxx喷水动漫| 涩涩视频在线观看免费| 国产成人小视频在线观看| 欧美男男freegayvideosroom| 免费一级特黄特色毛片久久看| 99re视频精品| 波多野结衣视频免费观看| 在线日韩欧美视频| 欧美特黄色片| 久久视频免费在线| 国产成人精品www牛牛影视| 久久精品美女视频| 日韩精品视频观看| 黑人极品ⅴideos精品欧美棵| 国产精品一区二区免费| 亚洲欧美日韩在线观看a三区| 精品欧美一区二区久久久| 欧美三级一区二区| 九色porny丨首页在线| 国产精品va在线| 影视亚洲一区二区三区| 韩国三级hd两男一女| 色综合久久88色综合天天| 成人亚洲综合天堂| 亚洲xxxxx| 亚洲性人人天天夜夜摸| 谁有免费的黄色网址| 欧美高清dvd| 国产99在线| 一区二区三区四区欧美日韩| 美女视频网站久久| 国产精品电影一区| 国产suv精品一区二区四区视频| 日韩在线一级片| 国产网站一区二区| 中文字幕欧美人妻精品| 精品少妇v888av| 免费观看不卡av| 国产男女无遮挡猛进猛出| 丰满岳妇乱一区二区三区| 色欧美激情视频在线| 国产精品中出一区二区三区| 日本伊人色综合网| 精品视频一区二区在线观看| 亚洲大胆人体视频| 高清av一区二区三区| www在线观看免费| 亚洲色图在线播放| 久久精品蜜桃|