调通了上传接口,新增下载文件接口。

This commit is contained in:
chenxudong 2025-06-18 13:59:21 +08:00
parent effa0d9f4d
commit 3722dfb4f0
3 changed files with 56 additions and 3 deletions

View File

@ -66,4 +66,7 @@ public class ImportFileInfo extends BaseModel {
@TableField(value = "permanent_deleted") @TableField(value = "permanent_deleted")
private Boolean permanentDeleted; private Boolean permanentDeleted;
@TableField(value = "src_path")
private String srcPath;
} }

View File

@ -1,9 +1,15 @@
package com.electromagnetic.industry.software.manage.service; package com.electromagnetic.industry.software.manage.service;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
public interface ImportPrjService { public interface ImportPrjService {
boolean importPrj(MultipartFile file); boolean importPrj(MultipartFile file);
ResponseEntity<InputStreamResource> download(String id, HttpServletResponse response);
} }

View File

@ -1,7 +1,10 @@
package com.electromagnetic.industry.software.manage.service.serviceimpl; package com.electromagnetic.industry.software.manage.service.serviceimpl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.text.StrFormatter;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -12,12 +15,20 @@ import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum;
import com.electromagnetic.industry.software.common.exception.BizException; import com.electromagnetic.industry.software.common.exception.BizException;
import com.electromagnetic.industry.software.common.util.EleCommonUtil; import com.electromagnetic.industry.software.common.util.EleCommonUtil;
import com.electromagnetic.industry.software.common.util.IdWorker; import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.config.ElePropertyConfig; import com.electromagnetic.industry.software.manage.config.ElePropertyConfig;
import com.electromagnetic.industry.software.manage.mapper.ImportPrjInfoMapper; import com.electromagnetic.industry.software.manage.mapper.ImportPrjInfoMapper;
import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo;
import com.electromagnetic.industry.software.manage.pojo.models.ImportFileInfo; import com.electromagnetic.industry.software.manage.pojo.models.ImportFileInfo;
import com.electromagnetic.industry.software.manage.service.ImportPrjService; import com.electromagnetic.industry.software.manage.service.ImportPrjService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.mockito.internal.util.io.IOUtil; import org.mockito.internal.util.io.IOUtil;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -36,13 +47,14 @@ public class ImportPrjServiceImpl extends ServiceImpl<ImportPrjInfoMapper, Impor
@Resource @Resource
private ElePropertyConfig elePropertyConfig; private ElePropertyConfig elePropertyConfig;
@Resource
private CommonService commonService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean importPrj(MultipartFile file) { public boolean importPrj(MultipartFile file) {
String zipTmpPath = elePropertyConfig.getEleTmpPath() + File.pathSeparator + UUID.randomUUID() + ".zip"; String zipTmpPath = elePropertyConfig.getEleTmpPath() + File.pathSeparator + UUID.randomUUID() + ".zip";
ZipFile zipFile = null; ZipFile zipFile = null;
// zipTmpPath = "D:\\tmp\\szsd\\data\\ele.zip";
try { try {
FileUtil.writeFromStream(file.getInputStream(), zipTmpPath); FileUtil.writeFromStream(file.getInputStream(), zipTmpPath);
Map<String, String> pathIdMap = new HashMap<>(); Map<String, String> pathIdMap = new HashMap<>();
@ -82,6 +94,7 @@ public class ImportPrjServiceImpl extends ServiceImpl<ImportPrjInfoMapper, Impor
.setFileContent("") .setFileContent("")
.setDataType(isDirectory ? EleDataTypeEnum.FOLDER.code : EleDataTypeEnum.FILE.code) .setDataType(isDirectory ? EleDataTypeEnum.FOLDER.code : EleDataTypeEnum.FILE.code)
.setFileSize(entry.getSize()) .setFileSize(entry.getSize())
.setSrcPath(entryName)
.setPermanentDeleted(false); .setPermanentDeleted(false);
resetPrjName(importFileInfo); resetPrjName(importFileInfo);
if (isDirectory) { if (isDirectory) {
@ -102,9 +115,9 @@ public class ImportPrjServiceImpl extends ServiceImpl<ImportPrjInfoMapper, Impor
String newId = entry.getKey(); String newId = entry.getKey();
ZipEntry tmp = entry.getValue(); ZipEntry tmp = entry.getValue();
InputStream inputStream = zipFile.getInputStream(tmp); InputStream inputStream = zipFile.getInputStream(tmp);
String destPath = elePropertyConfig.getEleTmpPath() + File.pathSeparator + newId; String destPath = elePropertyConfig.getImportPrjPath() + File.separator + newId;
FileUtil.writeFromStream(inputStream, destPath); FileUtil.writeFromStream(inputStream, destPath);
EleCommonUtil.decryptFile(destPath, SecureUtil.aes(FILE_SEC_PASSWD.getBytes())); EleCommonUtil.encryptFile(destPath, SecureUtil.aes(FILE_SEC_PASSWD.getBytes()));
} }
} catch (Exception e) { } catch (Exception e) {
throw new BizException("导入工程失败,原因 " + e.getMessage(), e); throw new BizException("导入工程失败,原因 " + e.getMessage(), e);
@ -115,6 +128,37 @@ public class ImportPrjServiceImpl extends ServiceImpl<ImportPrjInfoMapper, Impor
return true; return true;
} }
@Override
public ResponseEntity<InputStreamResource> download(String id, HttpServletResponse response) {
String fileName = "";
ImportFileInfo fileInfo = this.baseMapper.selectById(id);
String fileSysPath = elePropertyConfig.getImportPrjPath() + File.pathSeparator + id;
String dbPath = fileInfo.getSrcPath();
try {
Assert.isTrue(FileUtil.exist(fileSysPath), "下载文件不存在,路径为 {}", dbPath);
FileSystemResource fileSystemResource = new FileSystemResource(fileSysPath);
fileName = fileSystemResource.getFilename();
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
String newFileName = Base64.encode(fileInfo.getFileName() + "." + fileInfo.getFileType());
response.setHeader("content-disposition", "attachment;filename=" + newFileName);
UserThreadLocal.setSuccessInfo(fileInfo.getParentId(), id, "下载文件 {} 成功,文件路径 {}", fileInfo.getFileName() + "." + fileInfo.getFileType(), dbPath);
// 构建响应实体(可以返回<byte[]或Resource返回类型取决body入参类型)
return ResponseEntity
.ok()
.headers(headers)
.contentLength(fileSystemResource.contentLength())
.contentType(MediaType.parseMediaType("application/octet-stream;charset=UTF-8"))
.body(new InputStreamResource(fileSystemResource.getInputStream()));
} catch (Exception e) {
String info = StrFormatter.format("下载文件异常 {},路径 {}", fileName, dbPath);
log.error(info, e);
throw new BizException(info);
}
}
public void resetPrjName(ImportFileInfo importFileInfo) { public void resetPrjName(ImportFileInfo importFileInfo) {
if (!StrUtil.equals(importFileInfo.getParentId(), ElectromagneticConstants.PRJ_PARENT_ID)) { if (!StrUtil.equals(importFileInfo.getParentId(), ElectromagneticConstants.PRJ_PARENT_ID)) {
return; return;