SpringBoot整合Tika实现对文件类型校验和元数据读取

一、什么是Tika

Tika是Apache下开源的文档处理工具,支持多种格式文件的内容解析,主要功能包括文档类型检测、内容提取、元数据提取、语言检测。

Tika是一个具有内置解析器用于处理各种文档类型的程序框架。该框架公布了标准的API供应用程序调用并完成从文档中提取文本和元数据,内置解析器会在后台通过外部程序提供的API与之交互。这使得你的应用程序能够针对不同的文档类型使用相同的API。当程序需要从文档中提取文本时,Tika会找到相应的解释器。

二、SpringBoot如何整合Tika

2.1 添加pom依赖

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

2.2 添加tika配置文件

<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <encodingDetectors>
        <encodingDetector class="org.apache.tika.parser.html.HtmlEncodingDetector">
            <params>
                <param name="markLimit" type="int">64000</param>
            </params>
        </encodingDetector>
        <encodingDetector class="org.apache.tika.parser.txt.UniversalEncodingDetector">
            <params>
                <param name="markLimit" type="int">64001</param>
            </params>
        </encodingDetector>
        <encodingDetector class="org.apache.tika.parser.txt.Icu4jEncodingDetector">
            <params>
                <param name="markLimit" type="int">64002</param>
            </params>
        </encodingDetector>
    </encodingDetectors>
</properties>

 2.3 增加Tika的配置类

package com.lh.config;

import org.apache.tika.Tika;
import org.apache.tika.config.TikaConfig;
import org.apache.tika.detect.Detector;
import org.apache.tika.exception.TikaException;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.Parser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.InputStream;


/**
 * @author LH
 */
@Configuration
public class MyTikaConfig {

    @Autowired
    private ResourceLoader resourceLoader;

    @Bean
    public Tika tika() throws TikaException, IOException, SAXException {
        Resource resource = resourceLoader.getResource("classpath:tika-config.xml");
        InputStream inputStream = resource.getInputStream();
        TikaConfig config = new TikaConfig(inputStream);
        // 校验器
        Detector detector = config.getDetector();
        // 解析器
        Parser autoDetectParser = new AutoDetectParser(config);
        return new Tika(detector, autoDetectParser);
    }
}

 2.4 定义校验文件类型的工具类

package com.lh.service;

import com.lh.constant.FileTypeConst;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.tika.Tika;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author LH
 */
@Slf4j
public class FileTypeCheck {

    private static List<String> list = new ArrayList<>(20);

    static {
        list.add(FileTypeConst.FILE_TYPE_XLS);
        list.add(FileTypeConst.FILE_TYPE_XLSX);
        list.add(FileTypeConst.FILE_TYPE_DOC);
        list.add(FileTypeConst.FILE_TYPE_DOCX);
        list.add(FileTypeConst.FILE_TYPE_PDF);
        list.add(FileTypeConst.FILE_TYPE_JSON);
        list.add(FileTypeConst.FILE_TYPE_XML);
        list.add(FileTypeConst.FILE_TYPE_SVG);
        list.add(FileTypeConst.FILE_TYPE_PNG);
    }


    public static void getFileTypeByFileName(final String fileName, MultipartFile mFile) {
        Tika defaultTika = new Tika();
        String fileType;
        final File file = new File(fileName);
        try {
            FileUtils.copyInputStreamToFile(mFile.getInputStream(), file);
            fileType = defaultTika.detect(file);

            if (!list.contains(fileType)) {
                throw new RuntimeException("请上传正确的文件类型!!!");
            }

        } catch (IOException e) {
            log.error("getFileTypeByFileName exception:", e);
        } finally {
            if (file.exists()) {
                file.delete();
            }
        }
    }

}

 2.5 定义支持的文件类型常量

package com.lh.constant;

/**
 * @author LH
 */
public class FileTypeConst {
    public static final String FILE_TYPE_XLS = "application/vnd.ms-excel";
    public static final String FILE_TYPE_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    public static final String FILE_TYPE_DOC = "application/msword";
    public static final String FILE_TYPE_DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
    public static final String FILE_TYPE_PDF = "application/pdf";
    public static final String FILE_TYPE_JSON = "application/json";
    public static final String FILE_TYPE_XML = "application/xml";
    public static final String FILE_TYPE_PNG = "image/png";
    public static final String FILE_TYPE_SVG = "image/svg";
}

 2.6 写controller层测试

2.6.1 测试文件类型

    /**
     * 文件校验
     *
     * @param file
     * @throws IOException
     */
    @PostMapping("import")
    public void importExcel(MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        FileTypeCheck.getFileTypeByFileName(fileName, file);
    }

调接口测试,判断当前文件类型是否在支持的文件类型常量中

识别出当前的文件类型为“application.json”

2.6.2 读取源文件数据

    /**
     * Apache tika
     * 轻松实现各种文档内容解析和校验
     *
     * @throws Exception
     */
    @GetMapping("getTika")
    public void getTika() throws Exception {
        Path path = Paths.get("F:\\Java_High\\Course\\46 tika轻松实现各种文档内容解析和校验\\tikademo\\src\\main\\resources", "application.yml");
//        Path path = Paths.get("C:\\Users\\LH\\Desktop\\","test.json");
        String back = tika.parseToString(path.toFile());
        System.out.println("校验文件:");
        System.out.println(back);
    }

ApiPost调接口测试

 

 如图,实现了对文件数据的提取。

三、总结

以上,就是SpringBoot整合Tika的完整过程,整合完成后,我们可以根据实际需要进行代码封装,实现对文件类型的校验、对文件元数据的提取。由于Tika可以实现对文件数据的提取,所以它可以实现部分OCR识别的功能。

Spring Boot 集成 Apache Tika 可以帮助我们在应用程序中轻松实现文件类型检测和内容提取功能。以下是集成步骤: 1. **添加依赖**: 首先,在你的 `pom.xml` 文件中添加 Apache Tika 的依赖: ```xml <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.4.1</version> </dependency> ``` 2. **创建配置类**: 创建一个配置类来初始化 Tika 实例: ```java import org.apache.tika.Tika; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TikaConfig { @Bean public Tika tika() { return new Tika(); } } ``` 3. **使用 Tika**: 在你的服务或控制器中注入 Tika 实例并使用它来检测文件类型和提取内容: ```java import org.apache.tika.Tika; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @Service public class FileService { @Autowired private Tika tika; public String detectFileType(MultipartFile file) throws Exception { return tika.detect(file.getBytes()); } public String extractContent(MultipartFile file) throws Exception { return tika.parseToString(file.getInputStream()); } } ``` 4. **创建控制器**: 创建一个控制器来处理文件上传请求: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/files") public class FileController { @Autowired private FileService fileService; @PostMapping("/upload") public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) { try { String fileType = fileService.detectFileType(file); String content = fileService.extractContent(file); return new ResponseEntity<>("File Type: " + fileType + "\nContent: " + content, HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>("Error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } } ``` 通过以上步骤,你就可以在 Spring Boot 应用中集成 Apache Tika实现文件类型检测和内容提取功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值