后端大屏保存处理压缩数据

This commit is contained in:
sky_iroi
2026-04-29 09:47:17 +08:00
parent 94a7c9e000
commit ade105364c
2 changed files with 75 additions and 6 deletions

View File

@@ -1,6 +1,7 @@
package top.lidee.taie.business.modules.dashboard.controller; package top.lidee.taie.business.modules.dashboard.controller;
import com.alibaba.fastjson.JSONObject;
import top.lidee.taie.annotation.Permission; import top.lidee.taie.annotation.Permission;
import top.lidee.taie.annotation.log.LideeAuditLog; import top.lidee.taie.annotation.log.LideeAuditLog;
import top.lidee.taie.bean.ResponseBean; import top.lidee.taie.bean.ResponseBean;
@@ -18,6 +19,12 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Map;
import java.util.zip.GZIPInputStream;
/** /**
* @desc 大屏设计 controller * @desc 大屏设计 controller
@@ -49,14 +56,20 @@ public class ReportDashboardController {
/** /**
* 保存大屏设计 * 保存大屏设计
* @param dto * @param payload
* @return * @return
*/ */
@PostMapping @PostMapping
@Permission(code = "design", name = "设计大屏") @Permission(code = "design", name = "设计大屏")
@LideeAuditLog(pageTitle = "新增") @LideeAuditLog(pageTitle = "新增")
public ResponseBean insert(@RequestBody ReportDashboardObjectDto dto) { public ResponseBean insert(@RequestBody Map<String, Object> payload) {
reportDashboardService.insertDashboard(dto); try{
String json = decodeGzip(payload);
ReportDashboardObjectDto dto = JSONObject.parseObject(json,ReportDashboardObjectDto.class);
reportDashboardService.insertDashboard(dto);
} catch (IOException e) {
return ResponseBean.builder().code("500").message("保存失败").build();
}
return ResponseBean.builder().build(); return ResponseBean.builder().build();
} }
@@ -105,4 +118,58 @@ public class ReportDashboardController {
return ResponseBean.builder().data(reportShareService.insertShare(dto)).build(); return ResponseBean.builder().data(reportShareService.insertShare(dto)).build();
} }
/**
* 处理测压缩请求的接口方法
* @param payload 包含请求体的Map其中content字段为Base64编码的内容compressed字段表示是否压缩
* @return ResponseBean 响应对象
* @throws IOException 可能抛出的IO异常
*/
private String decodeGzip(Map<String, Object> payload) throws IOException {
// 1. 获取 Base64 编码的压缩内容
String base64Content = (String) payload.get("content");
// 获取是否压缩的标志默认为false
boolean isCompressed = (Boolean) payload.getOrDefault("compressed", false);
String json;
// 判断内容是否被压缩
if (isCompressed && base64Content != null) {
// 2. Base64 解码将Base64字符串解码为字节数组
byte[] compressedBytes = Base64.getDecoder().decode(base64Content);
// 3. Gzip 解压将Gzip压缩的字节数组解压为JSON字符串
json = decompressGzip(compressedBytes);
} else {
// 如果未压缩直接使用Base64内容
json = base64Content; // 未压缩的情况
}
// 打印解压后的数据到控制台,用于调试
System.out.println("解压后的数据: " + json);
// 返回响应对象
return json;
}
/**
* 解压GZIP压缩的字节数组并返回解压后的字符串
* @param compressedData GZIP压缩的字节数组
* @return 解压后的字符串
* @throws IOException 如果发生I/O错误
*/
private String decompressGzip(byte[] compressedData) throws IOException {
// 使用try-with-resources语句确保资源自动关闭
try (GZIPInputStream gzipIn = new GZIPInputStream(new ByteArrayInputStream(compressedData));
// 创建BufferedReader以行为单位读取解压后的数据
java.io.BufferedReader reader = new java.io.BufferedReader(
new java.io.InputStreamReader(gzipIn, StandardCharsets.UTF_8))) {
// 使用StringBuilder高效地构建解压后的字符串
StringBuilder sb = new StringBuilder();
String line;
// 逐行读取解压后的数据
while ((line = reader.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
}
} }

View File

@@ -1,5 +1,7 @@
server: server:
port: 48090 port: 48090
compression:
enabled: true
servlet: servlet:
encoding: encoding:
charset: UTF-8 charset: UTF-8
@@ -32,11 +34,11 @@ spring:
messages: messages:
basename: i18n/messages basename: i18n/messages
datasource: datasource:
url: jdbc:mysql://127.0.0.1:3306/lidee_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true url: jdbc:mysql://192.168.1.243:3306/lidee_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
username: root username: root
# password: root # password: root
password: gryy@8888 password: gryy@8888
# url: jdbc:mysql://127.0.0.1:3306/lidee_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true # url: jdbc:mysql://192.168.1.243:3306/lidee_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
# username: root # username: root
# password: Lidee@654! # password: Lidee@654!
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
@@ -47,7 +49,7 @@ spring:
min-idle: 50 min-idle: 50
max-active: 100 max-active: 100
# 获取连接等待超时的时间 # 获取连接等待超时的时间
max-wait: 5000 max-wait: 50000
# 配置间隔多久才进行一次检测 # 配置间隔多久才进行一次检测
time-between-eviction-runs-millis: 60000 time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存时间 # 配置一个连接在池中最小生存时间