当前位置: 首页 > news >正文

Spring Boot + Apache Tika 从文件或文件流中提取文本内容

应用效果:

1、安装 Apache Tika 依赖

pom.xml

    <!-- Apache Tika 从文件中提取结构化文本和元数据 --><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>

2、前端 Vue3

API:qualityFile.ts

/*** 从文件或文件流中提取文本内容* @param fileNo 文件编号(可能包含非安全字符,如:4.2 2人员v∕V/v+DW=dw,其中空格、全角斜杠∕、半角斜杠/、加号+、非ASCII字符​​(如中文、日文等),这些字符为非安全字符,在URL中都会被编码传输)* @returns 文本内容*/
export const qualityFileParseService = (fileNo: string) => {return request.get("/resources/qualityFile/parse", {params: {fileNo: fileNo}});
};

UI:QualityFile.vue

// 提取
const onParseClick = async (fileNo: string) => {const result = await qualityFileParseService(fileNo);store.currentParseFileText = result.data;// 显示质量体系文件文本提取内容模态框showContentDialogRef.value?.showDialog();
};<BasePreventReClickButtonclass="table-btn"type="primary"size="default"text:loading="false":disabled="scope.row.isNullContent"@click="onParseClick(scope.row.fileNo)">提取</BasePreventReClickButton>

3、后端 Spring Boot

Controller:QualityFileController.java

    /*** 从文件或文件流中提取文本内容** @param fileNo 文件编号(可能包含非安全字符,如:4.2 2人员v∕V/v+DW=dw,其中空格、全角斜杠∕、半角斜杠/、加号+、中文为非安全字符)* @return 文本内容* @apiNote 本接口使用防抖机制,3s 内重复请求会被忽略*/@GetMapping("/parse")@Debounce(key = "/resources/qualityFile/parse", value = 3000)public Result<String> parse(String fileNo) throws TikaException, IOException {log.info("【质量体系文件】,提取文件中的文本内容,/resources/qualityFile/parse,fileNo = {}", fileNo);String fileContentStr = qualityFileService.parse(fileNo);return Result.success(fileContentStr);}

Service:QualityFileService.java

    /*** 从文件或文件流中提取文本内容*/String parse(String fileNo) throws TikaException, IOException;

Service 实现:QualityFileServiceImpl.java

    /*** 从文件或文件流中提取文本内容*/@Overridepublic String parse(String fileNo) throws TikaException, IOException {// 获取文件数据FileData fileData = qualityFileMapper.selectFileData(fileNo);// 从文件名中获取路径分隔符String pathSplitString = FileUtils.getPathSplitString(fileData.getFileName());// 有路径分隔符,提取本地磁盘中文件的文本内容if (!pathSplitString.isEmpty()) {// 获取文件绝对路径String filePathName = FileUtils.joinDirectoryPath(mainDirectoryPath, fileData.getFileName());// 提取本地磁盘中文件的文本内容return FileUtils.parseFile(new File(filePathName));}// 无路径分隔符,提取数据库中文件流的文本内容else {InputStream fileStream = new ByteArrayInputStream(fileData.getFileContent());// 提取数据库中文件流的文本内容return FileUtils.parseFile(fileStream);}}

文件工具类:FileUtils.java

package com.weiyu.utils;import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;import java.io.File;
import java.io.IOException;
import java.io.InputStream;/*** 文件工具*/
public class FileUtils {private static final Tika tika = new Tika();/*** 解析文件,提取文件中的文本内容** @param file 文件* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/public static String parseFile(File file) throws IOException, TikaException {return tika.parseToString(file);}/*** 解析文件,提取文件流中的文本内容** @param fileStream 文件流* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/public static String parseFile(InputStream fileStream) throws IOException, TikaException {return tika.parseToString(fileStream);}
}


文章转载自:

http://mrv3d8FQ.kchwr.cn
http://HCD2WNe5.kchwr.cn
http://FyZEev6E.kchwr.cn
http://QkS7MdMY.kchwr.cn
http://KM8dy0pV.kchwr.cn
http://8tVKjn1m.kchwr.cn
http://rVYX7k9a.kchwr.cn
http://embqIVFh.kchwr.cn
http://Ugc1g7rY.kchwr.cn
http://ykJ0E7xV.kchwr.cn
http://EQ3dlTuh.kchwr.cn
http://uSAX1BgW.kchwr.cn
http://dVhfuH8e.kchwr.cn
http://GU1bLEBC.kchwr.cn
http://XYtu6Q7m.kchwr.cn
http://1zjlOOXZ.kchwr.cn
http://AGnm0e0z.kchwr.cn
http://Lln2fAkJ.kchwr.cn
http://tuO91sSW.kchwr.cn
http://heBwz3QA.kchwr.cn
http://9Q6wh7Xc.kchwr.cn
http://b13BsdAz.kchwr.cn
http://Zm91uFBk.kchwr.cn
http://cRGMfS3g.kchwr.cn
http://8TVKmKiV.kchwr.cn
http://Ak4zpFEH.kchwr.cn
http://N6kqIEQR.kchwr.cn
http://SSR3Fg13.kchwr.cn
http://Mx5C1I06.kchwr.cn
http://5yVfaMAr.kchwr.cn
http://www.dtcms.com/a/371730.html

相关文章:

  • day26|学习前端之算法学习
  • 数据结构之二叉树(2)
  • Mac设置中的安全性缺少“任何来源”
  • 样式化你的 Next.js 应用:CSS 模块、Tailwind CSS 和全局样式
  • Qwen2.5-VL技术详解
  • Claude code 使用笔记
  • FPGA学习笔记——SDR SDRAM的读写(不调用IP核版)
  • C++ 常见面试题汇总
  • cifar10分类对比:使用PyTorch卷积神经网络和SVM
  • 2025算法八股——机器学习——SVM损失函数
  • kafka特性和原理
  • webpack和vite优化方案都有哪些
  • Unity UI 中最干净的点击区域实现:RaycastZone 完整实战讲解
  • Java开发环境配置入门指南
  • lua中table键类型及lua中table的初始化有几种方式
  • 【CMake】缓存变量
  • Flink NetworkBufferPool核心原理解析
  • python数据可视化之Matplotlib(8)-Matplotlib样式系统深度解析:从入门到企业级应用
  • Recharts:React图表库,组件化设计助力高效数据可视化开发
  • Linux知识清单
  • SpringMVC 入门详解: MVC 思想(附核心流程)
  • CMake简易使用教程
  • daily notes[13]
  • Solana 核心概念:计算单元与交易成本解析
  • 【系统分析师】第11章-关键技术:软件需求工程(核心总结)
  • 如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比
  • 做好LoRaWAN的传感器都需要实现哪些功能点?
  • React入门 | React 新手入门与常用库和工具
  • jvm问题排查
  • C/C++数据结构之栈基础