fix(file-upload): 解决附件上传和配置文件加载问题

main
zhaokai 2026-07-06 13:55:52 +08:00
parent b427c30582
commit c40ec8dc4d
5 changed files with 110 additions and 30 deletions

View File

@ -4,6 +4,6 @@ spring:
# - classpath:nacos.yml
# - classpath:sdk.yml
- classpath:nacos-prod.yml
- classpath:sdk-prod.yml
# - classpath:sdk-prod-gwj.yml
# - classpath:sdk-prod.yml
- classpath:sdk-prod-gwj.yml
- classpath:swagger.yml

View File

@ -64,7 +64,6 @@ public class SgInformAddExe {
SgInformE sgInformE = new SgInformE();
BeanUtils.copyProperties(inform, sgInformE);
// 通知接收接口未传业务主键,按当前约定每次生成新的 informId 并绑定图片外键。
sgInformE.setInformId(Tools.get32UUID());
handleCreateFields(sgInformE, inform);
@ -98,20 +97,40 @@ public class SgInformAddExe {
List<ImgFilesDO> imgFilesDOList = new ArrayList<>();
byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key);
for (MultipartFile multipartFile : files) {
if (multipartFile == null || multipartFile.isEmpty()) {
continue;
}
SM4 sm4 = SmUtil.sm4(decryptKey);
byte[] decrypt = sm4.decrypt(multipartFile.getInputStream());
String fileName = Tools.get32UUID() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));
String originalFilename = normalizeEncryptedFileName(multipartFile.getOriginalFilename());
if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) {
throw new BizException("通知附件名称不合法");
}
String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "inform");
ImgFilesDO imgFilesDO = new ImgFilesDO();
imgFilesDO.setImgFilesId(Tools.get32UUID());
imgFilesDO.setFilePath(filePath);
imgFilesDO.setForeignKey(informId);
imgFilesDO.setFileName(multipartFile.getOriginalFilename());
imgFilesDO.setFileName(originalFilename);
imgFilesDO.setType(3);
imgFilesDOList.add(imgFilesDO);
log.info("通知附件名称标准化完成,原始名称:{},保存名称:{}", multipartFile.getOriginalFilename(), originalFilename);
}
if (!imgFilesDOList.isEmpty()) {
imgFilesRepository.saveBatch(imgFilesDOList);
}
imgFilesRepository.saveBatch(imgFilesDOList);
log.info("数港通知附件保存完成,通知业务主键:{},附件数量:{}", informId, imgFilesDOList.size());
}
private String normalizeEncryptedFileName(String encryptedFileName) {
if (StringUtils.isBlank(encryptedFileName)) {
return encryptedFileName;
}
if (encryptedFileName.endsWith(".encrypted")) {
return encryptedFileName.substring(0, encryptedFileName.length() - 10);
}
return encryptedFileName;
}
}

View File

@ -1,6 +1,5 @@
package com.zcloud.safety.command;
import cn.hutool.core.date.DateUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SM4;
import com.alibaba.cola.exception.BizException;
@ -50,7 +49,7 @@ public class SgNoticeAddExe {
public boolean execute(SgNoticeAddCmd cmd) {
SgNoticeE sgNoticeE = new SgNoticeE();
BeanUtils.copyProperties(cmd, sgNoticeE);
boolean res = false;
boolean res;
try {
res = sgNoticeGateway.add(sgNoticeE);
} catch (Exception e) {
@ -69,7 +68,7 @@ public class SgNoticeAddExe {
try {
log.info("开始处理数港公告入库,公告业务主键:{},附件数量:{}", notice.getNoticeId(), files == null ? 0 : files.length);
String noticeId = notice.getNoticeId();
String noticeId = notice.getNoticeId();
SgNoticeDO byNoticeId = null;
if (StringUtils.isNotBlank(noticeId)) {
@ -88,22 +87,33 @@ public class SgNoticeAddExe {
if (files != null && files.length > 0) {
List<ImgFilesDO> imgFilesDOList = new ArrayList<>();
byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key);
SM4 sm4 = SmUtil.sm4(decryptKey);
for (MultipartFile multipartFile : files) {
SM4 sm4 = SmUtil.sm4(EncryptAndDecryptUtil.decryptSm2(key));
if (multipartFile == null || multipartFile.isEmpty()) {
continue;
}
byte[] decrypt = sm4.decrypt(multipartFile.getInputStream());
// 生成文件名
String fileName = Tools.get32UUID() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));
String originalFilename = normalizeEncryptedFileName(multipartFile.getOriginalFilename());
if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) {
throw new BizException("公告附件名称不合法");
}
String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "notice");
ImgFilesDO imgFilesDO = new ImgFilesDO();
imgFilesDO.setImgFilesId(Tools.get32UUID());
imgFilesDO.setFilePath(filePath);
imgFilesDO.setForeignKey(sgNoticeE.getNoticeId());
imgFilesDO.setFileName(multipartFile.getOriginalFilename());
imgFilesDO.setFileName(originalFilename);
imgFilesDO.setType(2);
imgFilesDOList.add(imgFilesDO);
log.info("公告附件名称标准化完成,原始名称:{},保存名称:{}", multipartFile.getOriginalFilename(), originalFilename);
}
if (!imgFilesDOList.isEmpty()) {
imgFilesRepository.saveBatch(imgFilesDOList);
}
imgFilesRepository.saveBatch(imgFilesDOList);
log.info("数港公告附件保存完成,公告业务主键:{},图片数量:{}", notice.getNoticeId(), imgFilesDOList.size());
}
@ -120,8 +130,9 @@ public class SgNoticeAddExe {
throw new RuntimeException(e);
}
}
/**
*
/**
*
*/
private void handleCreateFields(SgNoticeE sgNoticeE, SgNoticeAddDTO notice) {
if (StringUtils.isNotBlank(notice.getCreateBy())) {
@ -130,7 +141,7 @@ public class SgNoticeAddExe {
if (StringUtils.isNotBlank(notice.getCreateTime())) {
try {
LocalDateTime createTime = LocalDateTime.parse(notice.getCreateTime().trim(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime createTime = LocalDateTime.parse(notice.getCreateTime().trim(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
sgNoticeE.setCreateTime(createTime);
} catch (Exception e) {
log.warn("解析创建时间失败,使用当前时间,原始值:{},错误:{}", notice.getCreateTime(), e.getMessage());
@ -141,7 +152,6 @@ public class SgNoticeAddExe {
}
}
/**
*
*/
@ -150,4 +160,17 @@ public class SgNoticeAddExe {
imgFilesRepository.deletedImgFilesByForeignId(noticeId);
}
}
/**
* .encrypted
*/
private String normalizeEncryptedFileName(String encryptedFileName) {
if (StringUtils.isBlank(encryptedFileName)) {
return encryptedFileName;
}
if (encryptedFileName.endsWith(".encrypted")) {
return encryptedFileName.substring(0, encryptedFileName.length() - 10);
}
return encryptedFileName;
}
}

View File

@ -68,7 +68,6 @@ public class SgReferenceAddExe {
throw new BizException("新增互学互鉴后未查询到数据");
}
// 新增时直接使用本次请求附件推送,避免依赖先落库再按外键反查附件。
sgReferencePushSupport.pushReference(latestReference, PushOperationTypeEnum.ADD, cmd.getFiles());
log.info("互学互鉴新增完成,本地主键:{},附件数量:{}", sgReferenceE.getId(), cmd.getFiles() == null ? 0 : cmd.getFiles().length);
return true;
@ -159,7 +158,6 @@ public class SgReferenceAddExe {
}
}
private void fillCreateFields(SgReferenceE sgReferenceE, SgReferenceReceiveDTO reference) {
if (StringUtils.isNotBlank(reference.getCreateBy())) {
sgReferenceE.setCreateName(reference.getCreateBy().trim());
@ -179,10 +177,14 @@ public class SgReferenceAddExe {
if (file == null || file.isEmpty()) {
continue;
}
String fileName = Tools.get32UUID() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String originalFilename = normalizeEncryptedFileName(file.getOriginalFilename());
if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) {
throw new BizException("互学互鉴附件名称不合法");
}
String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(file.getBytes(), fileName, "reference");
imgFilesDOList.add(buildImgFile(referenceId, file.getOriginalFilename(), filePath));
imgFilesDOList.add(buildImgFile(referenceId, originalFilename, filePath));
log.info("互学互鉴本地附件名称标准化完成,原始名称:{},保存名称:{}", file.getOriginalFilename(), originalFilename);
}
saveImgFiles(referenceId, imgFilesDOList);
}
@ -200,9 +202,14 @@ public class SgReferenceAddExe {
}
SM4 sm4 = SmUtil.sm4(decryptKey);
byte[] decrypt = sm4.decrypt(file.getInputStream());
String fileName = Tools.get32UUID() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String originalFilename = normalizeEncryptedFileName(file.getOriginalFilename());
if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) {
throw new BizException("互学互鉴附件名称不合法");
}
String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "reference");
imgFilesDOList.add(buildImgFile(referenceId, file.getOriginalFilename(), filePath));
imgFilesDOList.add(buildImgFile(referenceId, originalFilename, filePath));
log.info("互学互鉴接收附件名称标准化完成,原始名称:{},保存名称:{}", file.getOriginalFilename(), originalFilename);
}
saveImgFiles(referenceId, imgFilesDOList);
}
@ -224,4 +231,14 @@ public class SgReferenceAddExe {
imgFilesRepository.saveBatch(imgFilesDOList);
log.info("互学互鉴附件保存完成,本地主键:{},附件数量:{}", referenceId, imgFilesDOList.size());
}
private String normalizeEncryptedFileName(String encryptedFileName) {
if (StringUtils.isBlank(encryptedFileName)) {
return encryptedFileName;
}
if (encryptedFileName.endsWith(".encrypted")) {
return encryptedFileName.substring(0, encryptedFileName.length() - 10);
}
return encryptedFileName;
}
}

View File

@ -15,6 +15,7 @@ import com.zcloud.safety.persistence.dataobject.SgSuperviseDO;
import com.zcloud.safety.persistence.repository.ImgFilesRepository;
import com.zcloud.safety.persistence.repository.SgSuperviseRepository;
import lombok.AllArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -61,7 +62,6 @@ public class SgSuperviseAddExe {
public void addReceive(SgSuperviseAddDTO supervise, String key, MultipartFile[] files) {
SgSuperviseE sgSuperviseE = new SgSuperviseE();
BeanUtils.copyProperties(supervise, sgSuperviseE);
// 数港督办id按现有约定直接映射到本地主键id。
sgSuperviseE.setId(supervise.getSuperviseId());
try {
@ -78,10 +78,18 @@ public class SgSuperviseAddExe {
if (files != null && files.length > 0) {
List<ImgFilesDO> imgFilesDOList = new ArrayList<>();
byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key);
for (MultipartFile multipartFile : files) {
SM4 sm4 = SmUtil.sm4(EncryptAndDecryptUtil.decryptSm2(key));
if (multipartFile == null || multipartFile.isEmpty()) {
continue;
}
SM4 sm4 = SmUtil.sm4(decryptKey);
byte[] decrypt = sm4.decrypt(multipartFile.getInputStream());
String fileName = Tools.get32UUID() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));
String originalFilename = normalizeEncryptedFileName(multipartFile.getOriginalFilename());
if (StringUtils.isBlank(originalFilename) || originalFilename.lastIndexOf(".") < 0) {
throw new BizException("督办附件名称不合法");
}
String fileName = Tools.get32UUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "supervise");
@ -89,11 +97,14 @@ public class SgSuperviseAddExe {
imgFilesDO.setImgFilesId(Tools.get32UUID());
imgFilesDO.setFilePath(filePath);
imgFilesDO.setForeignKey(sgSuperviseE.getSuperviseId());
imgFilesDO.setFileName(multipartFile.getOriginalFilename());
imgFilesDO.setFileName(originalFilename);
imgFilesDO.setType(1);
imgFilesDOList.add(imgFilesDO);
log.info("督办附件名称标准化完成,原始名称:{},保存名称:{}", multipartFile.getOriginalFilename(), originalFilename);
}
if (!imgFilesDOList.isEmpty()) {
imgFilesRepository.saveBatch(imgFilesDOList);
}
imgFilesRepository.saveBatch(imgFilesDOList);
log.info("数港督办附件保存完成督办id{},图片数量:{}", supervise.getSuperviseId(), imgFilesDOList.size());
}
@ -109,4 +120,14 @@ public class SgSuperviseAddExe {
throw new RuntimeException(e);
}
}
private String normalizeEncryptedFileName(String encryptedFileName) {
if (StringUtils.isBlank(encryptedFileName)) {
return encryptedFileName;
}
if (encryptedFileName.endsWith(".encrypted")) {
return encryptedFileName.substring(0, encryptedFileName.length() - 10);
}
return encryptedFileName;
}
}