This commit is contained in:
2025-11-23 14:26:04 +08:00
parent 1027622380
commit 6912919692
2 changed files with 466 additions and 295 deletions

View File

@@ -0,0 +1,92 @@
package com.point.strategy.common;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicLong;
/**
* 内存监控工具类
* 用于监控JVM内存使用情况防止内存溢出
*/
@Slf4j
@Component
public class MemoryMonitor {
private static final long MEMORY_THRESHOLD = 500 * 1024 * 1024; // 500MB阈值
private static final AtomicLong startTime = new AtomicLong();
private static final String OPERATION_NAME = "hookUpTwo";
/**
* 开始内存监控
* @param operation 操作名称
*/
public static void startMonitoring(String operation) {
startTime.set(System.currentTimeMillis());
Runtime runtime = Runtime.getRuntime();
long initialMemory = (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024;
log.info("开始 {} - 初始内存使用: {}MB, 最大内存: {}MB",
operation, initialMemory, runtime.maxMemory() / 1024 / 1024);
}
/**
* 检查内存使用情况
*/
public static void checkMemoryUsage() {
Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
long maxMemory = runtime.maxMemory();
long freeMemory = runtime.freeMemory();
long totalMemory = runtime.totalMemory();
if (usedMemory > MEMORY_THRESHOLD) {
log.warn("内存使用超过阈值: {}MB / {}MB (总内存: {}MB, 空闲: {}MB)",
usedMemory / 1024 / 1024, maxMemory / 1024 / 1024,
totalMemory / 1024 / 1024, freeMemory / 1024 / 1024);
forceGC();
}
}
/**
* 强制垃圾回收
*/
public static void forceGC() {
log.debug("执行强制垃圾回收...");
System.gc();
System.runFinalization();
try {
Thread.sleep(100); // 等待GC完成
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
/**
* 停止监控并输出结果
*/
public static void stopMonitoring() {
long duration = System.currentTimeMillis() - startTime.get();
Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
long maxMemory = runtime.maxMemory();
log.info("{} 操作完成 - 耗时: {}ms, 最终内存使用: {}MB / {}MB",
OPERATION_NAME, duration, usedMemory / 1024 / 1024, maxMemory / 1024 / 1024);
}
/**
* 获取当前内存使用情况
* @return 内存使用信息
*/
public static String getMemoryInfo() {
Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
long maxMemory = runtime.maxMemory();
long freeMemory = runtime.freeMemory();
long totalMemory = runtime.totalMemory();
return String.format("内存使用: %dMB/%dMB (总内存: %dMB, 空闲: %dMB)",
usedMemory / 1024 / 1024, maxMemory / 1024 / 1024,
totalMemory / 1024 / 1024, freeMemory / 1024 / 1024);
}
}

View File

@@ -26,8 +26,11 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.*;
import java.util.*;
import java.util.concurrent.Semaphore;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -114,6 +117,9 @@ public class ImportService {
//创建线程池工具类
ThreadPoolUtils threadPoolUtils = new ThreadPoolUtils(20);
//文件处理并发控制信号量,限制同时处理的文件数量
private Semaphore fileProcessSemaphore = new Semaphore(10);
/**
* 根据操作系统类型获取网络上传文件路径配置
@@ -1958,132 +1964,156 @@ public class ImportService {
//获取表名
TtableDescription ttableDescription = ttableDescriptionMapper.selectTtableDescription(entityId);
String tableName = ttableDescription.getTableName();
//文件解析
File[] files = new File(localPath).listFiles();
if(null == files || files.length < 1){
//使用NIO Path替代File
Path localPathObj = Paths.get(localPath);
if (!Files.exists(localPathObj) || !Files.isDirectory(localPathObj)) {
System.out.println("文件路径错误或不存在");
return json = AjaxJson.returnExceptionInfo("文件路径错误或不存在");
}
for (File file : files) {
if(file.isDirectory()){
//获取folder_no案卷级档号
String folderNo = file.getName();
//获取
File[] files1 = file.listFiles();
Arrays.sort(files1);
for (File file1 : files1) {
int i = 1;
String pieceNo = file1.getName();
String archiveNo = folderNo + "-" + pieceNo;
String saveUrl = combinePath(uploadPath, "uploadFile") + File.separator ;
String replace=archiveNo;
// if(archiveNo.contains("·")){
// replace = archiveNo.replace("·", ".");
// }
String dir1 = saveUrl +"/"+ replace + '/';
String dir = "uploadFile" +"/"+ replace + '/';
//获取id
HashMap mapThree = new HashMap();
StringBuffer conditionSql = new StringBuffer();
// conditionSql.append("piece_no");
// conditionSql.append("=");
// conditionSql.append("'"+pieceNo+"'");
// conditionSql.append("and folder_no");
// conditionSql.append("=");
// conditionSql.append("'"+folderNo+"'");
conditionSql.append("archive_no");
conditionSql.append("=");
conditionSql.append("'"+archiveNo+"'");
mapThree.put("tableName", tableName+ "_temp");
mapThree.put("conditionSql", conditionSql.toString());
List list = docSimpleMapper.selectObject(mapThree);
if(CollectionUtils.isEmpty(list)){
return json = AjaxJson.returnExceptionInfo("系统里面没有该档号"+archiveNo);
}
Map<String,Object> map = (Map<String, Object>) list.get(0);
int id = (Integer) map.get("id");
//获取图片
File[] files2 = file1.listFiles();
if(1==type){
//覆盖 先删除wsjh_20201103104220949_temp_file表的记录
HashMap mapTwo = new HashMap();
StringBuffer conditionSqlTwo = new StringBuffer();
conditionSqlTwo.append("rec_id"+"="+id);
mapTwo.put("tableName", tableName+ "_temp_file");
mapTwo.put("conditionSql", conditionSqlTwo.toString());
docSimpleMapper.deleteObject(mapTwo);
//开始挂接
for (File file3 : files2) {
//上传文件
String imageName = "";
if("".equals(AbSurface)){
imageName = uploadFileAB(file1, dir1);
}else {
//上传文件
imageName = uploadFile(file3, dir1, replace, i);
}
//插入到表中
AjaxJson json1 = insertFile(file3, id, dir, tableName+ "_temp_file", imageName,i);
if ("101".equals(json1.getCode())) {
falseNum++;
}
if ("100".equals(json1.getCode())) {
successNum++;
}
i++;
String[] strings = file3.getName().split("\\.");
String name = file3.getName();
String fileType = strings[strings.length - 1];
if(!fileType.equals("mp3") || !fileType.equals("mp4")){
getText(file3,imageName,tableName);
}
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(localPathObj)) {
for (Path path : dirStream) {
if (Files.isDirectory(path)) {
//获取folder_no案卷级档
String folderNo = path.getFileName().toString();
//获取件号
Path pathObj = path;
try (DirectoryStream<Path> dirStream1 = Files.newDirectoryStream(pathObj)) {
List<Path> fileList = new ArrayList<>();
for (Path path1 : dirStream1) {
fileList.add(path1);
}
}else{
//追加
for (File file3 : files2) {
Map<String, Object> map5=new HashMap<>();
map5.put("tableName",tableName + "_temp_file");
map5.put("conditionSql","rec_id= '"+id+"'");
int page = danganguanliService.selectObjectCount(map5) + 1;
//上传文件
String imageName = "";
if("".equals(AbSurface)){
imageName = uploadFileAB(file1, dir1);
}else {
//上传文件
imageName = uploadFile(file3, dir1, replace, page);
//排序
fileList.sort(Comparator.comparing(Path::getFileName));
for (Path path1 : fileList) {
int i = 1;
String pieceNo = path1.getFileName().toString();
String archiveNo = folderNo + "-" + pieceNo;
String saveUrl = combinePath(uploadPath, "uploadFile") + File.separator;
String replace = archiveNo;
String dir1 = saveUrl + "/" + replace + '/';
String dir = "uploadFile" + "/" + replace + '/';
//获取id
HashMap mapThree = new HashMap();
StringBuffer conditionSql = new StringBuffer();
conditionSql.append("archive_no");
conditionSql.append("=");
conditionSql.append("'" + archiveNo + "'");
mapThree.put("tableName", tableName + "_temp");
mapThree.put("conditionSql", conditionSql.toString());
List list = docSimpleMapper.selectObject(mapThree);
if (CollectionUtils.isEmpty(list)) {
return json = AjaxJson.returnExceptionInfo("系统里面没有该档号" + archiveNo);
}
//插入到表中
AjaxJson json1 = insertFile(file3, id, dir, tableName+ "_temp_file", imageName,page);
if ("101".equals(json1.getCode())) {
falseNum++;
}
if ("100".equals(json1.getCode())) {
successNum++;
}
String[] strings = file3.getName().split("\\.");
String name = file3.getName();
String fileType = strings[strings.length - 1];
if(!fileType.equals("mp3") || !fileType.equals("mp4")){
getText(file3,imageName,tableName);
Map<String, Object> map = (Map<String, Object>) list.get(0);
int id = (Integer) map.get("id");
//获取图片
try (DirectoryStream<Path> dirStream2 = Files.newDirectoryStream(path1)) {
List<Path> fileList2 = new ArrayList<>();
for (Path path2 : dirStream2) {
fileList2.add(path2);
}
if (1 == type) {
//覆盖 先删除wsjh_20201103104220949_temp_file表的记录
HashMap mapTwo = new HashMap();
StringBuffer conditionSqlTwo = new StringBuffer();
conditionSqlTwo.append("rec_id" + "=" + id);
mapTwo.put("tableName", tableName + "_temp_file");
mapTwo.put("conditionSql", conditionSqlTwo.toString());
docSimpleMapper.deleteObject(mapTwo);
//开始挂接
for (Path path2 : fileList2) {
File file3 = path2.toFile();
//上传文件
String imageName = "";
if ("".equals(AbSurface)) {
imageName = uploadFileAB(path1.toFile(), dir1);
} else {
//上传文件
imageName = uploadFile(file3, dir1, replace, i);
}
//插入到表中
AjaxJson json1 = insertFile(file3, id, dir, tableName + "_temp_file", imageName, i);
if ("101".equals(json1.getCode())) {
falseNum++;
}
if ("100".equals(json1.getCode())) {
successNum++;
}
i++;
String fileName = file3.getName();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if (!fileType.equals("mp3") && !fileType.equals("mp4")) {
getText(file3, imageName, tableName);
}
//定期触发垃圾回收,释放内存
if (i % 50 == 0) {
System.gc();
}
}
} else {
//追加
for (Path path2 : fileList2) {
File file3 = path2.toFile();
Map<String, Object> map5 = new HashMap<>();
map5.put("tableName", tableName + "_temp_file");
map5.put("conditionSql", "rec_id= '" + id + "'");
int page = danganguanliService.selectObjectCount(map5) + 1;
//上传文件
String imageName = "";
if ("".equals(AbSurface)) {
imageName = uploadFileAB(path1.toFile(), dir1);
} else {
//上传文件
imageName = uploadFile(file3, dir1, replace, page);
}
//插入到表中
AjaxJson json1 = insertFile(file3, id, dir, tableName + "_temp_file", imageName, page);
if ("101".equals(json1.getCode())) {
falseNum++;
}
if ("100".equals(json1.getCode())) {
successNum++;
}
String fileName = file3.getName();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if (!fileType.equals("mp3") && !fileType.equals("mp4")) {
getText(file3, imageName, tableName);
}
//定期触发垃圾回收,释放内存
if (page % 50 == 0) {
System.gc();
}
}
}
}
//更新原文数量
Map<String, Object> map7 = new HashMap<>();
map7.put("tableName", tableName + "_temp");
map7.put("tableName2", tableName + "_temp_file");
map7.put("id", id);
danganguanliService.wsajmlTempCount(map7);
}
}
//更新原文数量
Map<String, Object> map7=new HashMap<>();
map7.put("tableName",tableName+"_temp");
map7.put("tableName2",tableName+"_temp_file");
map7.put("id",id);
danganguanliService.wsajmlTempCount(map7);
}
}
} catch (IOException e) {
throw new RuntimeException("处理文件时发生错误", e);
}
json = AjaxJson.returnInfo("成功上传数"+successNum+","+"失败上传数"+falseNum);
json.put("successNum",successNum);
json.put("falseNum",falseNum);
json = AjaxJson.returnInfo("成功上传数" + successNum + "," + "失败上传数" + falseNum);
json.put("successNum", successNum);
json.put("falseNum", falseNum);
return json;
}
@@ -2104,126 +2134,160 @@ public class ImportService {
//获取表名
TtableDescription ttableDescription = ttableDescriptionMapper.selectTtableDescription(entityId);
String tableName = ttableDescription.getTableName();
//文件解析
File[] files = new File(localPath).listFiles();
if(null == files || files.length < 1){
//使用NIO Path替代File
Path localPathObj = Paths.get(localPath);
if (!Files.exists(localPathObj) || !Files.isDirectory(localPathObj)) {
System.out.println("文件路径错误或不存在");
return json = AjaxJson.returnExceptionInfo("文件路径错误或不存在");
}
for (File file : files) {
if(file.isDirectory()){
//获取folder_no案卷级档号
String folderNo = file.getName();
//获取
File[] files1 = file.listFiles();
Arrays.sort(files1);
for (File file1 : files1) {
int i = 1;
String pieceNo = file1.getName();
String archiveNo = folderNo + "-" + pieceNo;
String saveUrl = combinePath(uploadPath, "uploadFile") + File.separator ;
String replace=archiveNo;
String dir1 = saveUrl +"/"+ replace + '/';
String dir = "uploadFile" +"/"+ replace + '/';
//获取id
HashMap mapThree = new HashMap();
StringBuffer conditionSql = new StringBuffer();
conditionSql.append("archive_no");
conditionSql.append("=");
conditionSql.append("'"+archiveNo+"'");
mapThree.put("tableName", tableName+ "_temp");
mapThree.put("conditionSql", conditionSql.toString());
List list = docSimpleMapper.selectObject(mapThree);
if(CollectionUtils.isEmpty(list)){
return json = AjaxJson.returnExceptionInfo("系统里面没有该档号"+archiveNo);
}
Map<String,Object> map = (Map<String, Object>) list.get(0);
int id = (Integer) map.get("id");
//获取图片
File[] files2 = file1.listFiles();
if(1==type){
//覆盖 先删除wsjh_20201103104220949_temp_file表的记录
HashMap mapTwo = new HashMap();
StringBuffer conditionSqlTwo = new StringBuffer();
conditionSqlTwo.append("rec_id"+"="+id);
mapTwo.put("tableName", tableName+ "_temp_file");
mapTwo.put("conditionSql", conditionSqlTwo.toString());
docSimpleMapper.deleteObject(mapTwo);
//开始挂接
for (File file3 : files2) {
//上传文件
String imageName = "";
if("".equals(AbSurface)){
imageName = uploadFileAB(file1, dir1);
//排序取文件名中的数字
i = extractSortValue(imageName)==0?i:extractSortValue(imageName);
}else {
//上传文件
imageName = uploadFile(file3, dir1, replace, i);
}
//插入到表中
AjaxJson json1 = insertFile(file3, id, dir, tableName+ "_temp_file", imageName,i);
if ("101".equals(json1.getCode())) {
falseNum++;
}
if ("100".equals(json1.getCode())) {
successNum++;
}
i++;
String[] strings = file3.getName().split("\\.");
String name = file3.getName();
String fileType = strings[strings.length - 1];
if(!fileType.equals("mp3") || !fileType.equals("mp4")){
getText(file3,imageName,tableName);
}
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(localPathObj)) {
for (Path path : dirStream) {
if (Files.isDirectory(path)) {
//获取folder_no案卷级档
String folderNo = path.getFileName().toString();
//获取件号
Path pathObj = path;
try (DirectoryStream<Path> dirStream1 = Files.newDirectoryStream(pathObj)) {
List<Path> fileList = new ArrayList<>();
for (Path path1 : dirStream1) {
fileList.add(path1);
}
}else{
//追加
for (File file3 : files2) {
Map<String, Object> map5=new HashMap<>();
map5.put("tableName",tableName + "_temp_file");
map5.put("conditionSql","rec_id= '"+id+"'");
int page = danganguanliService.selectObjectCount(map5) + 1;
//上传文件
String imageName = "";
if("".equals(AbSurface)){
imageName = uploadFileAB(file1, dir1);
//排序取文件名中的数字
page = extractSortValue(imageName)==0?page:extractSortValue(imageName);
}else {
//上传文件
imageName = uploadFile(file3, dir1, replace, page);
//排序
fileList.sort(Comparator.comparing(Path::getFileName));
for (Path path1 : fileList) {
int i = 1;
String pieceNo = path1.getFileName().toString();
String archiveNo = folderNo + "-" + pieceNo;
String saveUrl = combinePath(uploadPath, "uploadFile") + File.separator;
String replace = archiveNo;
String dir1 = saveUrl + "/" + replace + '/';
String dir = "uploadFile" + "/" + replace + '/';
//获取id
HashMap mapThree = new HashMap();
StringBuffer conditionSql = new StringBuffer();
conditionSql.append("archive_no");
conditionSql.append("=");
conditionSql.append("'" + archiveNo + "'");
mapThree.put("tableName", tableName + "_temp");
mapThree.put("conditionSql", conditionSql.toString());
List list = docSimpleMapper.selectObject(mapThree);
if (CollectionUtils.isEmpty(list)) {
return json = AjaxJson.returnExceptionInfo("系统里面没有该档号" + archiveNo);
}
//插入到表中
AjaxJson json1 = insertFile(file3, id, dir, tableName+ "_temp_file", imageName,page);
if ("101".equals(json1.getCode())) {
falseNum++;
}
if ("100".equals(json1.getCode())) {
successNum++;
}
String[] strings = file3.getName().split("\\.");
String name = file3.getName();
String fileType = strings[strings.length - 1];
if(!fileType.equals("mp3") || !fileType.equals("mp4")){
getText(file3,imageName,tableName);
Map<String, Object> map = (Map<String, Object>) list.get(0);
int id = (Integer) map.get("id");
//获取图片
try (DirectoryStream<Path> dirStream2 = Files.newDirectoryStream(path1)) {
List<Path> fileList2 = new ArrayList<>();
for (Path path2 : dirStream2) {
fileList2.add(path2);
}
if (1 == type) {
//覆盖 先删除wsjh_20201103104220949_temp_file表的记录
HashMap mapTwo = new HashMap();
StringBuffer conditionSqlTwo = new StringBuffer();
conditionSqlTwo.append("rec_id" + "=" + id);
mapTwo.put("tableName", tableName + "_temp_file");
mapTwo.put("conditionSql", conditionSqlTwo.toString());
docSimpleMapper.deleteObject(mapTwo);
//开始挂接
for (Path path2 : fileList2) {
File file3 = path2.toFile();
//上传文件
String imageName = "";
if ("".equals(AbSurface)) {
imageName = uploadFileAB(path1.toFile(), dir1);
//排序取文件名中的数字
i = extractSortValue(imageName) == 0 ? i : extractSortValue(imageName);
} else {
//上传文件
imageName = uploadFile(file3, dir1, replace, i);
}
//插入到表中
AjaxJson json1 = insertFile(file3, id, dir, tableName + "_temp_file", imageName, i);
if ("101".equals(json1.getCode())) {
falseNum++;
}
if ("100".equals(json1.getCode())) {
successNum++;
}
i++;
String fileName = file3.getName();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if (!fileType.equals("mp3") && !fileType.equals("mp4")) {
getText(file3, imageName, tableName);
}
//定期触发垃圾回收,释放内存
if (i % 50 == 0) {
System.gc();
}
}
} else {
//追加
for (Path path2 : fileList2) {
File file3 = path2.toFile();
Map<String, Object> map5 = new HashMap<>();
map5.put("tableName", tableName + "_temp_file");
map5.put("conditionSql", "rec_id= '" + id + "'");
int page = danganguanliService.selectObjectCount(map5) + 1;
//上传文件
String imageName = "";
if ("".equals(AbSurface)) {
imageName = uploadFileAB(path1.toFile(), dir1);
//排序取文件名中的数字
page = extractSortValue(imageName) == 0 ? page : extractSortValue(imageName);
} else {
//上传文件
imageName = uploadFile(file3, dir1, replace, page);
}
//插入到表中
AjaxJson json1 = insertFile(file3, id, dir, tableName + "_temp_file", imageName, page);
if ("101".equals(json1.getCode())) {
falseNum++;
}
if ("100".equals(json1.getCode())) {
successNum++;
}
String fileName = file3.getName();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if (!fileType.equals("mp3") && !fileType.equals("mp4")) {
getText(file3, imageName, tableName);
}
//定期触发垃圾回收,释放内存
if (page % 50 == 0) {
System.gc();
}
}
}
}
//更新原文数量
Map<String, Object> map7 = new HashMap<>();
map7.put("tableName", tableName + "_temp");
map7.put("tableName2", tableName + "_temp_file");
map7.put("id", id);
danganguanliService.wsajmlTempCount(map7);
}
}
//更新原文数量
Map<String, Object> map7=new HashMap<>();
map7.put("tableName",tableName+"_temp");
map7.put("tableName2",tableName+"_temp_file");
map7.put("id",id);
danganguanliService.wsajmlTempCount(map7);
}
}
} catch (IOException e) {
throw new RuntimeException("处理文件时发生错误", e);
}
json = AjaxJson.returnInfo("成功上传数"+successNum+","+"失败上传数"+falseNum);
json.put("successNum",successNum);
json.put("falseNum",falseNum);
json = AjaxJson.returnInfo("成功上传数" + successNum + "," + "失败上传数" + falseNum);
json.put("successNum", successNum);
json.put("falseNum", falseNum);
return json;
}
@@ -3858,8 +3922,6 @@ public class ImportService {
//上传文件
public String uploadFile(File file, String dir,String archiveNo,int page) throws Exception {
//上传文件到服务器
//输入流
InputStream is =new FileInputStream(file);
String[] strings = file.getName().split("\\.");
String type = strings[strings.length - 1].toLowerCase();
String name = "";
@@ -3873,21 +3935,30 @@ public class ImportService {
}
//改图片名拼接
String imgName = archiveNo + "." + name;
File fileOne = new File(dir);
if (!fileOne.exists()) {
fileOne.mkdirs();
Path dirPath = Paths.get(dir);
if (!Files.exists(dirPath)) {
Files.createDirectories(dirPath);
}
//获取输出流
OutputStream os= new FileOutputStream(dir+imgName);
byte [] bts = new byte [ 1024 ];
//一个一个字节的读取并写入
while (is.read(bts)!=- 1 )
{
os.write(bts);
//使用NIO进行文件复制更高效且内存友好
Path sourcePath = file.toPath();
Path targetPath = dirPath.resolve(imgName);
//使用try-with-resources确保资源释放
try (FileChannel sourceChannel = FileChannel.open(sourcePath, StandardOpenOption.READ);
FileChannel targetChannel = FileChannel.open(targetPath,
StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
//使用transferTo进行高效文件传输
long size = sourceChannel.size();
long transferred = sourceChannel.transferTo(0, size, targetChannel);
//确保所有数据都已传输
while (transferred < size) {
transferred += sourceChannel.transferTo(transferred, size - transferred, targetChannel);
}
}
os.flush();
os.close();
is.close();
String file_name_server = imgName;
if(!type.equals("mp3") && !type.equals("mp4")){
//生成一份pdf文件用于归档章的操作
@@ -3914,26 +3985,21 @@ public class ImportService {
//上传文件AB面
public String uploadFileAB(File file, String dir) throws IOException {
//上传文件到服务器
//输入流
InputStream is =new FileInputStream(file);
String[] strings = file.getName().split("\\.");
String type = strings[strings.length - 1].toLowerCase();
String imgName = file.getName();
File fileOne = new File(dir);
if (!fileOne.exists()) {
fileOne.mkdirs();
Path dirPath = Paths.get(dir);
if (!Files.exists(dirPath)) {
Files.createDirectories(dirPath);
}
//获取输出流
OutputStream os= new FileOutputStream(dir+imgName);
byte [] bts = new byte [ 1024 ];
//一个一个字节的读取并写入
while (is.read(bts)!=- 1 )
{
os.write(bts);
}
os.flush();
os.close();
is.close();
//使用NIO进行文件复制更高效且内存友好
Path sourcePath = file.toPath();
Path targetPath = dirPath.resolve(imgName);
//使用Files.copy进行高效文件复制
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
String file_name_server = imgName;
if(!type.equals("mp3") && !type.equals("mp4")){
//生成一份pdf文件用于归档章的操作
@@ -4039,48 +4105,61 @@ public class ImportService {
//todo 添加ocr日志
//启动一个线程根据ocr获取图片文字"file_content,"+
threadPoolUtils.submitTask(()->{
OcrLog ocrLog = new OcrLog();
if(youhongIntegrate){
try {
String ocrImageWord = OCRUtil.yhOcr(file,youhongBaseUrl);
Map<String, Object> map8=new HashMap<>();
String fieldValue = "file_content" + "=" + "'"+ocrImageWord+"'";
String conditionSql = "file_name_server" + "=" + "'"+fileNameServer+"'";
map8.put("tableName",tableName+"_temp_file");
map8.put("fieldValue",fieldValue);
map8.put("conditionSql",conditionSql);
danganguanliService.updateObject(map8);
ocrLog.setFileName(file.getName());
ocrLog.setTableName(tableName+"_temp_file");
ocrLog.setStatusType("0");
} catch (Exception e) {
ocrLog.setFailureReason(e.getMessage());
ocrLog.setStatusType("1");
ocrLogMapper.insert(ocrLog);
throw new RuntimeException("ocr:"+e);
//获取信号量许可限制并发OCR处理数量
try {
fileProcessSemaphore.acquire();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
try {
OcrLog ocrLog = new OcrLog();
if(youhongIntegrate){
try {
String ocrImageWord = OCRUtil.yhOcr(file,youhongBaseUrl);
Map<String, Object> map8=new HashMap<>();
String fieldValue = "file_content" + "=" + "'"+ocrImageWord+"'";
String conditionSql = "file_name_server" + "=" + "'"+fileNameServer+"'";
map8.put("tableName",tableName+"_temp_file");
map8.put("fieldValue",fieldValue);
map8.put("conditionSql",conditionSql);
danganguanliService.updateObject(map8);
ocrLog.setFileName(file.getName());
ocrLog.setTableName(tableName+"_temp_file");
ocrLog.setStatusType("0");
} catch (Exception e) {
ocrLog.setFailureReason(e.getMessage());
ocrLog.setStatusType("1");
ocrLogMapper.insert(ocrLog);
throw new RuntimeException("ocr:"+e);
}
}else{
OCRUtil.setTessPath(tessPath);
try {
String ocrImageWord = OCRUtil.getOcrImageWord(file);
Map<String, Object> map8=new HashMap<>();
String fieldValue = "file_content" + "=" + "'"+ocrImageWord+"'";
String conditionSql = "file_name_server" + "=" + "'"+fileNameServer+"'";
map8.put("tableName",tableName+"_temp_file");
map8.put("fieldValue",fieldValue);
map8.put("conditionSql",conditionSql);
danganguanliService.updateObject(map8);
ocrLog.setFileName(file.getName());
ocrLog.setTableName(tableName+"_temp_file");
ocrLog.setStatusType("0");
} catch (Exception e) {
ocrLog.setFailureReason(e.getMessage());
ocrLog.setStatusType("1");
ocrLogMapper.insert(ocrLog);
throw new RuntimeException("ocr:"+e);
}
}
}else{
OCRUtil.setTessPath(tessPath);
try {
String ocrImageWord = OCRUtil.getOcrImageWord(file);
Map<String, Object> map8=new HashMap<>();
String fieldValue = "file_content" + "=" + "'"+ocrImageWord+"'";
String conditionSql = "file_name_server" + "=" + "'"+fileNameServer+"'";
map8.put("tableName",tableName+"_temp_file");
map8.put("fieldValue",fieldValue);
map8.put("conditionSql",conditionSql);
danganguanliService.updateObject(map8);
ocrLog.setFileName(file.getName());
ocrLog.setTableName(tableName+"_temp_file");
ocrLog.setStatusType("0");
} catch (Exception e) {
ocrLog.setFailureReason(e.getMessage());
ocrLog.setStatusType("1");
ocrLogMapper.insert(ocrLog);
throw new RuntimeException("ocr:"+e);
}
}
ocrLogMapper.insert(ocrLog);
ocrLogMapper.insert(ocrLog);
} finally {
//释放信号量许可
fileProcessSemaphore.release();
}
});
}