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:nacos.yml
# - classpath:sdk.yml # - classpath:sdk.yml
- classpath:nacos-prod.yml - classpath:nacos-prod.yml
- classpath:sdk-prod.yml # - classpath:sdk-prod.yml
# - classpath:sdk-prod-gwj.yml - classpath:sdk-prod-gwj.yml
- classpath:swagger.yml - classpath:swagger.yml

View File

@ -64,7 +64,6 @@ public class SgInformAddExe {
SgInformE sgInformE = new SgInformE(); SgInformE sgInformE = new SgInformE();
BeanUtils.copyProperties(inform, sgInformE); BeanUtils.copyProperties(inform, sgInformE);
// 通知接收接口未传业务主键,按当前约定每次生成新的 informId 并绑定图片外键。
sgInformE.setInformId(Tools.get32UUID()); sgInformE.setInformId(Tools.get32UUID());
handleCreateFields(sgInformE, inform); handleCreateFields(sgInformE, inform);
@ -98,20 +97,40 @@ public class SgInformAddExe {
List<ImgFilesDO> imgFilesDOList = new ArrayList<>(); List<ImgFilesDO> imgFilesDOList = new ArrayList<>();
byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key); byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key);
for (MultipartFile multipartFile : files) { for (MultipartFile multipartFile : files) {
if (multipartFile == null || multipartFile.isEmpty()) {
continue;
}
SM4 sm4 = SmUtil.sm4(decryptKey); SM4 sm4 = SmUtil.sm4(decryptKey);
byte[] decrypt = sm4.decrypt(multipartFile.getInputStream()); 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"); String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "inform");
ImgFilesDO imgFilesDO = new ImgFilesDO(); ImgFilesDO imgFilesDO = new ImgFilesDO();
imgFilesDO.setImgFilesId(Tools.get32UUID()); imgFilesDO.setImgFilesId(Tools.get32UUID());
imgFilesDO.setFilePath(filePath); imgFilesDO.setFilePath(filePath);
imgFilesDO.setForeignKey(informId); imgFilesDO.setForeignKey(informId);
imgFilesDO.setFileName(multipartFile.getOriginalFilename()); imgFilesDO.setFileName(originalFilename);
imgFilesDO.setType(3); imgFilesDO.setType(3);
imgFilesDOList.add(imgFilesDO); imgFilesDOList.add(imgFilesDO);
log.info("通知附件名称标准化完成,原始名称:{},保存名称:{}", multipartFile.getOriginalFilename(), originalFilename);
} }
if (!imgFilesDOList.isEmpty()) {
imgFilesRepository.saveBatch(imgFilesDOList); imgFilesRepository.saveBatch(imgFilesDOList);
}
log.info("数港通知附件保存完成,通知业务主键:{},附件数量:{}", informId, imgFilesDOList.size()); 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; package com.zcloud.safety.command;
import cn.hutool.core.date.DateUtil;
import cn.hutool.crypto.SmUtil; import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SM4; import cn.hutool.crypto.symmetric.SM4;
import com.alibaba.cola.exception.BizException; import com.alibaba.cola.exception.BizException;
@ -50,7 +49,7 @@ public class SgNoticeAddExe {
public boolean execute(SgNoticeAddCmd cmd) { public boolean execute(SgNoticeAddCmd cmd) {
SgNoticeE sgNoticeE = new SgNoticeE(); SgNoticeE sgNoticeE = new SgNoticeE();
BeanUtils.copyProperties(cmd, sgNoticeE); BeanUtils.copyProperties(cmd, sgNoticeE);
boolean res = false; boolean res;
try { try {
res = sgNoticeGateway.add(sgNoticeE); res = sgNoticeGateway.add(sgNoticeE);
} catch (Exception e) { } catch (Exception e) {
@ -88,22 +87,33 @@ public class SgNoticeAddExe {
if (files != null && files.length > 0) { if (files != null && files.length > 0) {
List<ImgFilesDO> imgFilesDOList = new ArrayList<>(); List<ImgFilesDO> imgFilesDOList = new ArrayList<>();
byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key);
SM4 sm4 = SmUtil.sm4(decryptKey);
for (MultipartFile multipartFile : files) { for (MultipartFile multipartFile : files) {
SM4 sm4 = SmUtil.sm4(EncryptAndDecryptUtil.decryptSm2(key)); if (multipartFile == null || multipartFile.isEmpty()) {
continue;
}
byte[] decrypt = sm4.decrypt(multipartFile.getInputStream()); byte[] decrypt = sm4.decrypt(multipartFile.getInputStream());
// 生成文件名 String originalFilename = normalizeEncryptedFileName(multipartFile.getOriginalFilename());
String fileName = Tools.get32UUID() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")); 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"); String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "notice");
ImgFilesDO imgFilesDO = new ImgFilesDO(); ImgFilesDO imgFilesDO = new ImgFilesDO();
imgFilesDO.setImgFilesId(Tools.get32UUID()); imgFilesDO.setImgFilesId(Tools.get32UUID());
imgFilesDO.setFilePath(filePath); imgFilesDO.setFilePath(filePath);
imgFilesDO.setForeignKey(sgNoticeE.getNoticeId()); imgFilesDO.setForeignKey(sgNoticeE.getNoticeId());
imgFilesDO.setFileName(multipartFile.getOriginalFilename()); imgFilesDO.setFileName(originalFilename);
imgFilesDO.setType(2); imgFilesDO.setType(2);
imgFilesDOList.add(imgFilesDO); imgFilesDOList.add(imgFilesDO);
log.info("公告附件名称标准化完成,原始名称:{},保存名称:{}", multipartFile.getOriginalFilename(), originalFilename);
} }
if (!imgFilesDOList.isEmpty()) {
imgFilesRepository.saveBatch(imgFilesDOList); imgFilesRepository.saveBatch(imgFilesDOList);
}
log.info("数港公告附件保存完成,公告业务主键:{},图片数量:{}", notice.getNoticeId(), imgFilesDOList.size()); log.info("数港公告附件保存完成,公告业务主键:{},图片数量:{}", notice.getNoticeId(), imgFilesDOList.size());
} }
@ -120,8 +130,9 @@ public class SgNoticeAddExe {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
/** /**
* *
*/ */
private void handleCreateFields(SgNoticeE sgNoticeE, SgNoticeAddDTO notice) { private void handleCreateFields(SgNoticeE sgNoticeE, SgNoticeAddDTO notice) {
if (StringUtils.isNotBlank(notice.getCreateBy())) { if (StringUtils.isNotBlank(notice.getCreateBy())) {
@ -141,7 +152,6 @@ public class SgNoticeAddExe {
} }
} }
/** /**
* *
*/ */
@ -150,4 +160,17 @@ public class SgNoticeAddExe {
imgFilesRepository.deletedImgFilesByForeignId(noticeId); 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("新增互学互鉴后未查询到数据"); throw new BizException("新增互学互鉴后未查询到数据");
} }
// 新增时直接使用本次请求附件推送,避免依赖先落库再按外键反查附件。
sgReferencePushSupport.pushReference(latestReference, PushOperationTypeEnum.ADD, cmd.getFiles()); sgReferencePushSupport.pushReference(latestReference, PushOperationTypeEnum.ADD, cmd.getFiles());
log.info("互学互鉴新增完成,本地主键:{},附件数量:{}", sgReferenceE.getId(), cmd.getFiles() == null ? 0 : cmd.getFiles().length); log.info("互学互鉴新增完成,本地主键:{},附件数量:{}", sgReferenceE.getId(), cmd.getFiles() == null ? 0 : cmd.getFiles().length);
return true; return true;
@ -159,7 +158,6 @@ public class SgReferenceAddExe {
} }
} }
private void fillCreateFields(SgReferenceE sgReferenceE, SgReferenceReceiveDTO reference) { private void fillCreateFields(SgReferenceE sgReferenceE, SgReferenceReceiveDTO reference) {
if (StringUtils.isNotBlank(reference.getCreateBy())) { if (StringUtils.isNotBlank(reference.getCreateBy())) {
sgReferenceE.setCreateName(reference.getCreateBy().trim()); sgReferenceE.setCreateName(reference.getCreateBy().trim());
@ -179,10 +177,14 @@ public class SgReferenceAddExe {
if (file == null || file.isEmpty()) { if (file == null || file.isEmpty()) {
continue; 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"); 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); saveImgFiles(referenceId, imgFilesDOList);
} }
@ -200,9 +202,14 @@ public class SgReferenceAddExe {
} }
SM4 sm4 = SmUtil.sm4(decryptKey); SM4 sm4 = SmUtil.sm4(decryptKey);
byte[] decrypt = sm4.decrypt(file.getInputStream()); 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"); 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); saveImgFiles(referenceId, imgFilesDOList);
} }
@ -224,4 +231,14 @@ public class SgReferenceAddExe {
imgFilesRepository.saveBatch(imgFilesDOList); imgFilesRepository.saveBatch(imgFilesDOList);
log.info("互学互鉴附件保存完成,本地主键:{},附件数量:{}", referenceId, imgFilesDOList.size()); 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.ImgFilesRepository;
import com.zcloud.safety.persistence.repository.SgSuperviseRepository; import com.zcloud.safety.persistence.repository.SgSuperviseRepository;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -61,7 +62,6 @@ public class SgSuperviseAddExe {
public void addReceive(SgSuperviseAddDTO supervise, String key, MultipartFile[] files) { public void addReceive(SgSuperviseAddDTO supervise, String key, MultipartFile[] files) {
SgSuperviseE sgSuperviseE = new SgSuperviseE(); SgSuperviseE sgSuperviseE = new SgSuperviseE();
BeanUtils.copyProperties(supervise, sgSuperviseE); BeanUtils.copyProperties(supervise, sgSuperviseE);
// 数港督办id按现有约定直接映射到本地主键id。
sgSuperviseE.setId(supervise.getSuperviseId()); sgSuperviseE.setId(supervise.getSuperviseId());
try { try {
@ -78,10 +78,18 @@ public class SgSuperviseAddExe {
if (files != null && files.length > 0) { if (files != null && files.length > 0) {
List<ImgFilesDO> imgFilesDOList = new ArrayList<>(); List<ImgFilesDO> imgFilesDOList = new ArrayList<>();
byte[] decryptKey = EncryptAndDecryptUtil.decryptSm2(key);
for (MultipartFile multipartFile : files) { 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()); 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"); String filePath = zcloudImgFilesFacade.saveFileNoCorpinfoId(decrypt, fileName, "supervise");
@ -89,11 +97,14 @@ public class SgSuperviseAddExe {
imgFilesDO.setImgFilesId(Tools.get32UUID()); imgFilesDO.setImgFilesId(Tools.get32UUID());
imgFilesDO.setFilePath(filePath); imgFilesDO.setFilePath(filePath);
imgFilesDO.setForeignKey(sgSuperviseE.getSuperviseId()); imgFilesDO.setForeignKey(sgSuperviseE.getSuperviseId());
imgFilesDO.setFileName(multipartFile.getOriginalFilename()); imgFilesDO.setFileName(originalFilename);
imgFilesDO.setType(1); imgFilesDO.setType(1);
imgFilesDOList.add(imgFilesDO); imgFilesDOList.add(imgFilesDO);
log.info("督办附件名称标准化完成,原始名称:{},保存名称:{}", multipartFile.getOriginalFilename(), originalFilename);
} }
if (!imgFilesDOList.isEmpty()) {
imgFilesRepository.saveBatch(imgFilesDOList); imgFilesRepository.saveBatch(imgFilesDOList);
}
log.info("数港督办附件保存完成督办id{},图片数量:{}", supervise.getSuperviseId(), imgFilesDOList.size()); log.info("数港督办附件保存完成督办id{},图片数量:{}", supervise.getSuperviseId(), imgFilesDOList.size());
} }
@ -109,4 +120,14 @@ public class SgSuperviseAddExe {
throw new RuntimeException(e); 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;
}
} }