From c356c77683d055f82a668c28db8b56f9c5e04b84 Mon Sep 17 00:00:00 2001
From: 许鹏程 <1821349743@qq.com>
Date: 星期一, 19 五月 2025 13:19:39 +0800
Subject: [PATCH] fix:优化xls在web端预览失败的问题

---
 src/main/java/com/product/file/service/FileManagerService.java |  244 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 227 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/product/file/service/FileManagerService.java b/src/main/java/com/product/file/service/FileManagerService.java
index 9b9502f..add8ab3 100644
--- a/src/main/java/com/product/file/service/FileManagerService.java
+++ b/src/main/java/com/product/file/service/FileManagerService.java
@@ -1,9 +1,11 @@
 package com.product.file.service;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.product.common.lang.StringUtils;
+import com.product.core.config.CoreConst;
 import com.product.core.config.Global;
 import com.product.core.connection.ConnectionManager;
 import com.product.core.dao.BaseDao;
@@ -16,17 +18,16 @@
 import com.product.core.spring.context.SpringMVCContextHolder;
 import com.product.file.config.CmnConst;
 import com.product.file.config.FileCode;
+import com.product.file.util.AsposeUtil;
 import com.product.file.util.CreateDocumentIndexThread;
 import com.product.file.util.FileUtil;
 import com.product.file.util.FileUtils;
 import com.product.module.sys.entity.SystemUser;
+import com.product.util.BaseUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
@@ -319,7 +320,7 @@
 		String uuids = "";
 		for (Map.Entry<Object, Object> entry : map.entrySet()) {
 			fieldFse = fieldMetaEntity.getFieldMeta(fieldName);
-			if (fieldFse == null || !CmnConst.ATTACHMENT_TYPE.equals(fieldFse.getString(CmnConst.FIELD_TYPE))) {
+			if (fieldFse == null || (!CmnConst.ATTACHMENT_TYPE.equals(fieldFse.getString(CmnConst.FIELD_TYPE)) && !"file-image".equals(fieldFse.getString(CmnConst.FIELD_TYPE)))) {
 				fse.setValue(entry.getKey().toString(), null);
 				continue;
 			}
@@ -419,6 +420,174 @@
 	}
 
 	/**
+	 * 	鏍规嵁闄勪欢琛ㄦ暟鎹敓鎴愭枃妗g储寮�
+	 */
+	public void readAttachmentCreateIndex() {
+		// 閬嶅巻闄勪欢琛�
+		DataTableEntity dtAttachment = baseDao.listTable(CmnConst.PRODUCT_SYS_ATTACHMENTS);
+		if (BaseUtil.dataTableIsEmpty(dtAttachment)) {
+			return;
+		}
+		for (int i = 0; i < dtAttachment.getRows(); i++) {
+			// 鑾峰彇闄勪欢淇℃伅锛屽苟鍒ゆ柇鏄惁鏈夎〃鍜屽瓧娈�
+			FieldSetEntity fseAttachment = dtAttachment.getFieldSetEntity(i);
+			if (BaseUtil.strIsNull(fseAttachment.getString("attachment_data_field")) || BaseUtil.strIsNull(fseAttachment.getString("attachment_data_field"))) {
+				continue;
+			}
+			// 鏌ヨ鍘熸暟鎹紝鏈夊師鏁版嵁鍐嶇敓鎴愭枃妗f绱�
+			FieldSetEntity fseRecord = baseDao.getFieldSetEntityByFilter(fseAttachment.getString("attachment_data_table"), fseAttachment.getString("attachment_data_field") + " LIKE ?", new Object[]{"%" + fseAttachment.getUUID() + "%"}, false);
+			if (fseRecord != null) {
+				// 鐢熸垚鏂囨。妫�绱俊鎭�
+				FieldSetEntity fseIndex = new FieldSetEntity();
+				fseIndex.setTableName("fseIndex");
+				fseIndex.setValue("function_uuid", fseAttachment.getString("function_uuid"));
+				fseIndex.setValue("attachment_uuid", fseAttachment.getUUID());
+				CreateDocumentIndexThread.getInstance().appendAttaInfo(fseIndex);
+			}
+		}
+	}
+
+	/**
+	 * 绉诲姩绔崌绾э紝瀹夎鍖呬笅杞�
+	 *
+	 * @param fse
+	 * @param response
+	 */
+	public void getFileContent(FieldSetEntity fse, HttpServletResponse response, boolean isUpgrade) throws IOException {
+		if (isUpgrade) {
+			FieldSetEntity attachmentFse = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_ATTACHMENTS, fse.getUUID(), false);
+			if (attachmentFse == null || !"product_sys_app_version".equals(attachmentFse.getString("attachment_data_table"))) {
+				return;
+			}
+			logger.info("姝e湪鑾峰彇鏂囦欢娴�...");
+			boolean needDownloadFromServerFlag = "1".equals(attachmentFse.getString(CmnConst.UPLOAD_SIGN));
+			String dir = attachmentFse.getString(CmnConst.ATTACHMENT_URL);
+			String fileName = attachmentFse.getString(CmnConst.ATTACHMENT_TITLE);
+			//鐪熷疄鏂囦欢鍚�
+			String realFileName = attachmentFse.getString(CmnConst.FILE_NAME);
+			String viewOnlineSign = attachmentFse.getString(CmnConst.VIEW_ONLINE_SIGN);
+			boolean encrptSignFlag = "1".equals(attachmentFse.getString(CmnConst.ENCRPT_SIGN));
+			boolean needOnlineViewFlag = "1".equals(fse.getString(CmnConst.NEED_ONLINE_VIEW)) && "1".equals(viewOnlineSign);
+
+			String clientType = CoreConst.CLIENT_TYPE_APP;
+
+			String contentType = "multipart/form-data";
+			boolean isExcel = realFileName.endsWith(".xlsx") || realFileName.endsWith(".xls");
+			if (needOnlineViewFlag) {
+				//鐗规畩澶勭悊锛� 濡傛灉瀹㈡埛绔笉鏄疉pp 浣嗛瑙堢殑鏂囦欢鏄疎xcel 鐩存帴杩斿洖excel婧愭枃浠� content澶存爣璇嗘槸excel cheng 2025骞�2鏈�11鏃�10:41:41
+				if (isExcel && !CoreConst.CLIENT_TYPE_APP.equals(clientType)) {
+					contentType = "application/vnd.ms-excel";
+				} else {
+					dir += File.separator + CmnConst.TRANSFER_DIR_NAME;
+				}
+			}
+
+			String path = dir + File.separator + fileName;
+			if (needDownloadFromServerFlag) {
+				// 闇�瑕佷粠闄勪欢鏈嶅姟鍣ㄤ笂鍙栨枃浠�
+				FTPService ftpService = new FTPService();
+				logger.info("闇�瑕佷粠闄勪欢鏈嶅姟鍣ㄤ笂鍙栨枃浠�...");
+				response.setHeader("Access-Control-Expose-Headers", "*");
+
+				response.setContentType(contentType);
+				response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(realFileName, "UTF-8"));
+				//璁剧疆澶翠腑鐨勬枃浠剁被鍨�
+				if (!needOnlineViewFlag && !encrptSignFlag) {
+					logger.info("涓嶉渶瑕佽В瀵嗕笖鑾峰彇鍘熸枃浠�...");
+					try (ServletOutputStream os = response.getOutputStream()) {
+						ftpService.downloadFile(path, os);
+					}
+				} else {
+					logger.info("闇�瑕佽В瀵嗘垨鑰呰幏鍙栬浆鎹㈠悗鐨勬枃浠�...");
+					String localTempPath = Global.getSystemConfig("temp.dir", "") + File.separator + fileName;
+					File localTempFile = new File(localTempPath);
+					OutputStream tempOs = new FileOutputStream(localTempFile);
+					ftpService.downloadFile(path, tempOs);
+					tempOs.flush();
+					tempOs.close();
+					if (needOnlineViewFlag && localTempFile.length() == 0L) {
+						// 鑻ユ槸棰勮锛屼絾鏄浆鎹㈠悗鐨勬枃浠朵笉瀛樺湪锛岄偅涔堥噸鏂版墽琛岃浆鎹㈡搷浣�
+						File sourceFile = fileUtils.getFile(true, attachmentFse.getString(CmnConst.ATTACHMENT_URL), fileName, encrptSignFlag);
+						File tempSourceFile = new File(sourceFile.getParentFile().getAbsolutePath() + File.separator + attachmentFse.getString(CmnConst.FILE_NAME));
+						sourceFile.renameTo(tempSourceFile);
+						FileUtils.convertPdf(false, true, encrptSignFlag, true, tempSourceFile, dir, fileName, attachmentFse.getString(CmnConst.FILE_NAME));
+						tempSourceFile.delete();
+
+						// 閲嶆柊鎷夋枃浠�
+						tempOs = new FileOutputStream(localTempFile);
+						ftpService = new FTPService();
+						ftpService.downloadFile(path, tempOs);
+						tempOs.flush();
+						tempOs.close();
+					}
+					response.setContentLengthLong(localTempFile.length());
+					InputStream is = new FileInputStream(localTempFile);
+					int len;
+					byte[] b = new byte[1024];
+					try (ServletOutputStream os = response.getOutputStream()) {
+						while ((len = is.read(b)) > 0) {
+							os.write(encrptSignFlag ? FileUtil.decryption(b) : b, 0, len);
+						}
+						os.flush();
+						is.close();
+					}
+					// 鍒犻櫎涓存椂鏂囦欢
+					localTempFile.delete();
+				}
+			} else {
+				// 鐩存帴鍦ㄦ湰鍦扮殑鐩綍涓壘鏂囦欢
+				logger.info("鐩存帴鍦ㄦ湰鍦扮殑鐩綍涓壘鏂囦欢...");
+				String localBasePath = Global.getSystemConfig("local.dir", "");
+				path = localBasePath + File.separator + path;
+				File file = new File(path);
+				if (needOnlineViewFlag && file.exists() && CoreConst.CLIENT_TYPE_APP.equals(clientType)) {
+					//鐗规畩澶勭悊锛� 鏄疉pp 浣嗛瑙堢殑鏂囦欢鏄疎xcel 闇�瑕佸皢涔嬪墠宸茶浆鎹负鐨勬枃浠跺垹闄ゆ帀閲嶆柊杞崲锛堝洜杞崲鍚庣殑鏍煎紡涓嶆槸pdf)
+					String changeTime = "2025-02-11 23:59:59";
+					Date changeDate = DateUtil.parse(changeTime, "yyyy-MM-dd HH:mm:ss");
+					long fileTime = file.lastModified();
+					//濡傛灉鏃堕棿鏄� 2025骞�2鏈�10鏃�23:59:59锛岄偅涔堝氨閲嶆柊杞崲
+					//鍒犻櫎鏂囦欢
+					if (fileTime <= changeDate.getTime()) {
+						file.delete();
+					}
+				}
+				if (needOnlineViewFlag && !file.exists()) {
+					// 鑻ユ槸棰勮锛屼絾鏄浆鎹㈠悗鐨勬枃浠朵笉瀛樺湪锛岄偅涔堥噸鏂版墽琛岃浆鎹㈡搷浣�
+					File sourceFile = fileUtils.getFile(false, attachmentFse.getString(CmnConst.ATTACHMENT_URL), fileName, encrptSignFlag);
+					File tempSourceFile = new File(sourceFile.getParentFile().getAbsolutePath() + File.separator + attachmentFse.getString(CmnConst.FILE_NAME));
+					sourceFile.renameTo(tempSourceFile);
+					FileUtils.convertPdf(false, false, encrptSignFlag, true, tempSourceFile, dir, fileName, attachmentFse.getString(CmnConst.FILE_NAME));
+					tempSourceFile.delete();
+				}
+				int len;
+				byte[] b = new byte[1024];
+				InputStream is = new FileInputStream(file);
+				response.setHeader("Access-Control-Expose-Headers", "*");
+
+				response.setContentType(contentType);
+				response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(realFileName, "UTF-8"));
+				response.setContentLengthLong(file.length());
+				try (ServletOutputStream os = response.getOutputStream()) {
+					while ((len = is.read(b)) > 0) {
+						if (encrptSignFlag) {
+							// 闇�瑕佽В瀵�
+							logger.info("闇�瑕佽В瀵�...");
+							os.write(FileUtil.decryption(b), 0, len);
+						} else {
+							// 鏃犻渶瑙e瘑
+							os.write(b, 0, len);
+						}
+					}
+					os.flush();
+				}
+				is.close();
+			}
+			logger.info("鏂囦欢娴佽幏鍙栨垚鍔�");
+		}
+
+	}
+
+	/**
 	 * 鎻愬彇鏂囦欢淇℃伅-涓嬭浇鏂囦欢鎴栬�呭湪绾块瑙堟枃浠�
 	 *
 	 * @param fse
@@ -439,9 +608,17 @@
 		String viewOnlineSign = attachmentFse.getString(CmnConst.VIEW_ONLINE_SIGN);
 		boolean encrptSignFlag = "1".equals(attachmentFse.getString(CmnConst.ENCRPT_SIGN));
 		boolean needOnlineViewFlag = "1".equals(fse.getString(CmnConst.NEED_ONLINE_VIEW)) && "1".equals(viewOnlineSign);
-		if (needOnlineViewFlag && !realFileName.endsWith(".xlsx") && !realFileName.endsWith(".xls")) {
-			// 闇�瑕佸湪绾块瑙堜笖杞崲涔嬪悗鎵嶈兘鍦ㄧ嚎棰勮 excel 鏂囦欢涓嶉渶瑕佽浆鎹㈢洿鎺ヨ緭鍑洪瑙�
-			dir += File.separator + CmnConst.TRANSFER_DIR_NAME;
+		String clientType = SpringMVCContextHolder.getCurrentUser().getClientType();
+
+		String contentType = "multipart/form-data";
+		boolean isExcel = realFileName.endsWith(".xlsx") || realFileName.endsWith(".xls");
+		if (needOnlineViewFlag) {
+			//鐗规畩澶勭悊锛� 濡傛灉瀹㈡埛绔笉鏄疉pp 浣嗛瑙堢殑鏂囦欢鏄疎xcel 鐩存帴杩斿洖excel婧愭枃浠� content澶存爣璇嗘槸excel cheng 2025骞�2鏈�11鏃�10:41:41
+			if (isExcel && !CoreConst.CLIENT_TYPE_APP.equals(clientType)) {
+				contentType = "application/vnd.ms-excel";
+			} else {
+				dir += File.separator + CmnConst.TRANSFER_DIR_NAME;
+			}
 		}
 
 		String path = dir + File.separator + fileName;
@@ -450,11 +627,8 @@
 			FTPService ftpService = new FTPService();
 			logger.info("闇�瑕佷粠闄勪欢鏈嶅姟鍣ㄤ笂鍙栨枃浠�...");
 			response.setHeader("Access-Control-Expose-Headers", "*");
-			if (realFileName.endsWith(".xlsx") || realFileName.endsWith(".xls")) {
-				response.setContentType("application/vnd.ms-excel");
-			} else {
-				response.setContentType("multipart/form-data");
-			}
+
+			response.setContentType(contentType);
 			response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(realFileName, "UTF-8"));
 			//璁剧疆澶翠腑鐨勬枃浠剁被鍨�
 			if (!needOnlineViewFlag && !encrptSignFlag) {
@@ -485,6 +659,19 @@
 					tempOs.flush();
 					tempOs.close();
 				}
+				boolean delete = false;
+				if (realFileName.endsWith(".xls") && needOnlineViewFlag && localTempFile.exists() && !CoreConst.CLIENT_TYPE_APP.equals(clientType)) {
+					//杞崲涓簒lsx
+					AsposeUtil.xls2xlsx(localTempFile.getPath(), getSystemConfig("temp.dir", "/attachment/temp") + "/" + localTempFile.getName(), "xls");
+					File oldFile = localTempFile;
+					localTempFile = new File(getSystemConfig("temp.dir", "/attachment/temp") + "/" + localTempFile.getName());
+					if (!localTempFile.isFile()) {
+						localTempFile = oldFile;
+					} else {
+						delete = true;
+						oldFile.delete();
+					}
+				}
 				response.setContentLengthLong(localTempFile.length());
 				InputStream is = new FileInputStream(localTempFile);
 				int len;
@@ -505,6 +692,17 @@
 			String localBasePath = Global.getSystemConfig("local.dir", "");
 			path = localBasePath + File.separator + path;
 			File file = new File(path);
+			if (needOnlineViewFlag && file.exists() && CoreConst.CLIENT_TYPE_APP.equals(clientType)) {
+				//鐗规畩澶勭悊锛� 鏄疉pp 浣嗛瑙堢殑鏂囦欢鏄疎xcel 闇�瑕佸皢涔嬪墠宸茶浆鎹负鐨勬枃浠跺垹闄ゆ帀閲嶆柊杞崲锛堝洜杞崲鍚庣殑鏍煎紡涓嶆槸pdf)
+				String changeTime = "2025-02-11 23:59:59";
+				Date changeDate = DateUtil.parse(changeTime, "yyyy-MM-dd HH:mm:ss");
+				long fileTime = file.lastModified();
+				//濡傛灉鏃堕棿鏄� 2025骞�2鏈�10鏃�23:59:59锛岄偅涔堝氨閲嶆柊杞崲
+				//鍒犻櫎鏂囦欢
+				if (fileTime <= changeDate.getTime()) {
+					file.delete();
+				}
+			}
 			if (needOnlineViewFlag && !file.exists()) {
 				// 鑻ユ槸棰勮锛屼絾鏄浆鎹㈠悗鐨勬枃浠朵笉瀛樺湪锛岄偅涔堥噸鏂版墽琛岃浆鎹㈡搷浣�
 				File sourceFile = fileUtils.getFile(false, attachmentFse.getString(CmnConst.ATTACHMENT_URL), fileName, encrptSignFlag);
@@ -513,15 +711,24 @@
 				FileUtils.convertPdf(false, false, encrptSignFlag, true, tempSourceFile, dir, fileName, attachmentFse.getString(CmnConst.FILE_NAME));
 				tempSourceFile.delete();
 			}
+			boolean delete = false;
+			if (realFileName.endsWith(".xls") && needOnlineViewFlag && file.exists() && !CoreConst.CLIENT_TYPE_APP.equals(clientType)) {
+				//杞崲涓簒lsx
+				AsposeUtil.xls2xlsx(file.getPath(), getSystemConfig("temp.dir", "/attachment/temp") + "/" + file.getName(), "xls");
+				File oldFile = file;
+				file = new File(getSystemConfig("temp.dir", "/attachment/temp") + "/" + file.getName());
+				if (!file.isFile()) {
+					file = oldFile;
+				} else {
+					delete = true;
+				}
+			}
 			int len;
 			byte[] b = new byte[1024];
 			InputStream is = new FileInputStream(file);
 			response.setHeader("Access-Control-Expose-Headers", "*");
-			if (realFileName.endsWith(".xlsx") || realFileName.endsWith(".xls")) {
-				response.setContentType("application/vnd.ms-excel");
-			} else {
-				response.setContentType("multipart/form-data");
-			}
+
+			response.setContentType(contentType);
 			response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(realFileName, "UTF-8"));
 			response.setContentLengthLong(file.length());
 			try (ServletOutputStream os = response.getOutputStream()) {
@@ -538,6 +745,9 @@
 				os.flush();
 			}
 			is.close();
+			if (delete) {
+				file.delete();
+			}
 		}
 		logger.info("鏂囦欢娴佽幏鍙栨垚鍔�");
 	}

--
Gitblit v1.9.2