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