From bf0595ed0dc67207fd85714323b3dd3547ac545a Mon Sep 17 00:00:00 2001 From: RuicyWu <1063154311@qq.com> Date: Sat, 9 May 2026 10:48:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seeyon/utils/file/FileHandlerService.java | 104 ++++++++++++++++++ .../seeyon/utils/form/FormTableExecutor.java | 21 +++- .../com/seeyon/utils/form/SqlBuildParam.java | 9 ++ 3 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/seeyon/utils/file/FileHandlerService.java diff --git a/src/main/java/com/seeyon/utils/file/FileHandlerService.java b/src/main/java/com/seeyon/utils/file/FileHandlerService.java new file mode 100644 index 0000000..a8700aa --- /dev/null +++ b/src/main/java/com/seeyon/utils/file/FileHandlerService.java @@ -0,0 +1,104 @@ +package com.seeyon.utils.file; + +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.filemanager.manager.FileManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; + +public class FileHandlerService { + + private AttachmentManager attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + private FileManager fileManager = (FileManager) AppContext.getBean("fileManager"); + private static final String TEMP_DIR = System.getProperty("java.io.tmpdir") + File.separator + "seeyontempfile"; + + public void handleFile(String refId, HttpServletResponse response) throws Exception { + InputStream inputStream = null; + try { + Attachment attachment = attachmentManager.getAttachmentByFileURL(Long.valueOf(refId)); + inputStream = fileManager.getFileInputStream(attachment.getFileUrl()); + + // ⭐ 关键:重置 + response.reset(); + + // ⭐ 必须设置类型 + response.setContentType("application/octet-stream"); + + // ⭐ 文件名处理 + String encodedFileName = URLEncoder.encode(attachment.getFilename(), "UTF-8") + .replaceAll("\\+", "%20"); + + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader( + "Content-Disposition", + "attachment; filename=\"" + attachment.getFilename() + "\"; filename*=UTF-8''" + encodedFileName + ); + + // ⭐ 输出流 + OutputStream outputStream = response.getOutputStream(); + + byte[] buffer = new byte[2048]; + int len; + + while ((len = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, len); + } + + outputStream.flush(); + + } catch (Exception e) { + e.printStackTrace(); // ❗不要吞异常 + } finally { + try { + if (inputStream != null) inputStream.close(); + } catch (Exception ignored) {} + } + } + +// public ResponseEntity downloadFileStream(String refId) { +// InputStream inputStream = null; +// OutputStream ops = null; +// try { +// Attachment attachment = attachmentManager.getAttachmentByFileURL(Long.valueOf(refId)); +// inputStream = fileManager.getFileInputStream(attachment.getFileUrl()); +// //下载到本地临时文件夹 +// // 创建输出流,将文件保存到本地 +// ops = new FileOutputStream(TEMP_DIR); +// // 设置缓冲区 +// byte[] buffer = new byte[4096]; +// int bytesRead; +// while ((bytesRead = inputStream.read(buffer)) != -1) { +// ops.write(buffer, 0, bytesRead); +// } +// ops.flush(); +// ops.close(); +// File file = new File(TEMP_DIR); +// if (!file.exists()) { +// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); +// } +// // 封装文件为资源对象 +// Resource resource = new FileSystemResource(file); +// String fileName = attachment.getFilename(); +// // 设置响应头 +// String encodeName = URLEncoder.encode(fileName, "UTF-8"); +// String header = "attachment;filename=" + encodeName; +// return ResponseEntity.ok() +// .header(HttpHeaders.CONTENT_DISPOSITION, header) +// .header(HttpHeaders.CONTENT_TYPE, "application/octet-stream") +// .body(resource); +// +// }catch (Exception e) { +// e.printStackTrace(); // ❗不要吞异常 +// } finally { +// try { +// if (inputStream != null) inputStream.close(); +// } catch (Exception ignored) {} +// } +// +// } +} \ No newline at end of file diff --git a/src/main/java/com/seeyon/utils/form/FormTableExecutor.java b/src/main/java/com/seeyon/utils/form/FormTableExecutor.java index b6d07af..9a42852 100644 --- a/src/main/java/com/seeyon/utils/form/FormTableExecutor.java +++ b/src/main/java/com/seeyon/utils/form/FormTableExecutor.java @@ -95,6 +95,7 @@ public class FormTableExecutor { try { agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); + log.info("执行sql为: " + sqlMap.get("sql")); List> rows = agent.resultSetToList(); return rows.stream() @@ -125,6 +126,7 @@ public class FormTableExecutor { try { agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); + log.info("执行sql为: " + sqlMap.get("sql")); Map row = agent.resultSetToMap(); if (row == null) return null; @@ -161,6 +163,7 @@ public class FormTableExecutor { try { agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); + log.info("执行sql为: " + sqlMap.get("sql")); List> rows = agent.resultSetToList(); return rows.stream() @@ -190,6 +193,7 @@ public class FormTableExecutor { JDBCAgent agent = new JDBCAgent(); try { agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); + log.info("执行sql为: " + sqlMap.get("sql")); String dbName = (String) AppContext.getCache("DATABASE_NAME"); if ("mysql".equalsIgnoreCase(dbName)) { return (Long) agent.resultSetToMap().get("countnum"); @@ -221,6 +225,7 @@ public class FormTableExecutor { Map sqlMap = generateSql(param); JDBCAgent agent = new JDBCAgent(); try { + log.info("执行sql为: " + sqlMap.get("sql")); return agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); } catch (Exception e){ log.error("执行sql为: " + sqlMap.get("sql")); @@ -243,6 +248,7 @@ public class FormTableExecutor { Map sqlMap = generateSql(param); JDBCAgent agent = new JDBCAgent(); try { + log.info("执行sql为: " + sqlMap.get("sql")); return agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); } catch (Exception e){ log.error("执行sql为: " + sqlMap.get("sql")); @@ -266,6 +272,7 @@ public class FormTableExecutor { Map sqlMap = generateSql(param); JDBCAgent agent = new JDBCAgent(); try { + log.info("执行sql为: " + sqlMap.get("sql")); return agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); }catch (Exception e){ log.error("执行sql为: " + sqlMap.get("sql")); @@ -358,7 +365,7 @@ public class FormTableExecutor { List conditions, Integer limit, Integer offset, - String orderField) { + String orderField,String sortType) { String dbName = (String) AppContext.getCache("DATABASE_NAME"); String orderBy = (orderField == null) ? "start_date" : orderField; StringBuilder sql = new StringBuilder(); @@ -376,12 +383,15 @@ public class FormTableExecutor { } selectFields.append(",ID"); } + if(sortType == null) { + sortType = "ASC"; + } // ===== 2. Oracle 分页特殊处理 ===== if ("oracle".equalsIgnoreCase(dbName) && limit != null && offset != null) { sql.append("SELECT * FROM ( "); sql.append(" SELECT t.*, ROW_NUMBER() OVER (ORDER BY ") .append(orderBy) - .append(" DESC) rn "); + .append(" "+ sortType +") rn "); sql.append(" FROM ") .append(tableName) .append(" t "); @@ -395,7 +405,7 @@ public class FormTableExecutor { sql.append("SELECT ").append(selectFields); sql.append(" FROM ").append(tableName); sql.append(buildWhereClause(conditions, params)); - sql.append(" ORDER BY ").append(orderBy).append(" DESC"); + sql.append(" ORDER BY ").append(orderBy).append(" " + sortType); if (limit != null && offset != null) { if ("mysql".equalsIgnoreCase(dbName)) { sql.append(" LIMIT ").append(offset).append(",").append(limit); @@ -612,7 +622,7 @@ public class FormTableExecutor { return result; } - private static Map generateSql(SqlBuildParam param) { + public static Map generateSql(SqlBuildParam param) { if (param == null || param.getSqlType() == null) { throw new IllegalArgumentException("SqlBuildParam or SqlType cannot be null"); @@ -632,7 +642,8 @@ public class FormTableExecutor { param.getConditions(), param.getLimit(), param.getOffset(), - param.getOrderField() + param.getOrderField(), + param.getSortType() ); case UPDATE: return buildUpdateSql( diff --git a/src/main/java/com/seeyon/utils/form/SqlBuildParam.java b/src/main/java/com/seeyon/utils/form/SqlBuildParam.java index 3d612ce..ec16548 100644 --- a/src/main/java/com/seeyon/utils/form/SqlBuildParam.java +++ b/src/main/java/com/seeyon/utils/form/SqlBuildParam.java @@ -19,6 +19,7 @@ public class SqlBuildParam { private Integer pageSize; private String orderField; private String countField; + private String sortType; public SqlType getSqlType() { return sqlType; @@ -111,4 +112,12 @@ public class SqlBuildParam { public void setCountField(String countField) { this.countField = countField; } + + public String getSortType() { + return sortType; + } + + public void setSortType(String sortType) { + this.sortType = sortType; + } }