UploadController.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.loan.system.controller.wechat;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.loan.system.config.FileUploadConfig;
  4. import com.loan.system.domain.entity.Document;
  5. import com.loan.system.domain.enums.ExceptionEnum;
  6. import com.loan.system.domain.enums.StepEnum;
  7. import com.loan.system.domain.pojo.Result;
  8. import com.loan.system.domain.vo.DocumentVO;
  9. import com.loan.system.domain.vo.StepVO;
  10. import com.loan.system.exception.DescribeException;
  11. import com.loan.system.service.DocumentService;
  12. import com.loan.system.service.StepService;
  13. import com.loan.system.utils.ResultUtil;
  14. import io.swagger.annotations.Api;
  15. import io.swagger.annotations.ApiOperation;
  16. import org.apache.commons.io.FilenameUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.security.access.prepost.PreAuthorize;
  19. import org.springframework.util.ObjectUtils;
  20. import org.springframework.web.bind.annotation.*;
  21. import org.springframework.web.multipart.MultipartFile;
  22. import javax.servlet.http.HttpServletResponse;
  23. import java.io.*;
  24. import java.net.URLEncoder;
  25. import java.nio.file.Files;
  26. import java.nio.file.Path;
  27. import java.nio.file.Paths;
  28. import java.nio.file.StandardCopyOption;
  29. import java.time.LocalDateTime;
  30. import java.time.format.DateTimeFormatter;
  31. import java.util.*;
  32. import static com.loan.system.domain.enums.ExceptionEnum.STEP_HAS_NOT_PROCESS;
  33. @RestController
  34. @RequestMapping("/wechat/file")
  35. @Api(tags = "文件处理接口")
  36. public class UploadController {
  37. @Autowired
  38. private DocumentService fileService;
  39. @Autowired
  40. private FileUploadConfig config;
  41. @Autowired
  42. private StepService stepService;
  43. /** 上传文件(支持任意类型,只要在白名单内) */
  44. @PostMapping("/upload/{caseId}/{type}")
  45. @ApiOperation("文件上传")//若合同不是统一提交,则合同1,合同2,合同3
  46. @PreAuthorize("@pms.hasAnyRoles('LEAD_SALES','ASSIST_SALES')")
  47. public Result uploadFile(@PathVariable("caseId") Long caseId,@PathVariable("type") String fileType,@RequestParam(required = false) MultipartFile file,@RequestParam Map<String , String> isDelete) throws IOException{
  48. Iterator<Map.Entry<String, String>> iterator = isDelete.entrySet().iterator();
  49. while (iterator.hasNext()) {
  50. Map.Entry<String, String> entry = iterator.next();
  51. Long id = Long.parseLong(entry.getKey());
  52. Integer value = Integer.parseInt(entry.getValue());
  53. Document document = fileService.findById(id);
  54. if (ObjectUtils.isEmpty( document))
  55. break;
  56. if( value!= 0 ){
  57. System.out.println("删除文件"+id);
  58. fileService.deleteFileById(id);
  59. //删除本地文件
  60. deleteFile(document.getFilePath());
  61. }
  62. }
  63. if (file == null)
  64. return ResultUtil.success("success");
  65. String originalName = file.getOriginalFilename();
  66. String ext = FilenameUtils.getExtension(originalName).toLowerCase(Locale.ROOT);
  67. // 从配置中读取允许的扩展名
  68. Set<String> allowed = config.getAllowedExtensions();
  69. if (!allowed.contains(ext)) {
  70. ResultUtil.error(ExceptionEnum.FILE_UPLOAD_TYPE_NOT_DEFINED);
  71. }
  72. String newFileName = String.format("%d-%s-%s.%s", caseId, fileType, UUID.randomUUID(), ext);;
  73. // 生成新的文件名
  74. // 创建目录
  75. File uploadDir = new File(config.getUploadDir(), caseId + "/" + fileType);
  76. System.out.println(uploadDir);
  77. System.out.println(newFileName);
  78. if (!uploadDir.exists() && !uploadDir.mkdirs()) {
  79. return ResultUtil.error(ExceptionEnum.DIRECTORY_CREATE_ERROR);
  80. }
  81. // 使用NIO复制流,稳定性更好
  82. File destFile = new File(uploadDir, newFileName);
  83. try (InputStream in = file.getInputStream()) {
  84. System.out.println(destFile.toPath());
  85. Files.copy(in, destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
  86. }
  87. Document document = new Document();
  88. document.setCaseId(caseId);
  89. document.setFileName(newFileName);
  90. document.setOriginName(originalName);
  91. document.setFilePath(destFile.getPath());
  92. document.setFileSize(file.getSize());
  93. document.setDocType(ext);
  94. document.setDictType(fileType); // 简单转换为整数
  95. document.setIsDelete( false);
  96. document.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  97. document.setUpdateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  98. DocumentVO documentVO = fileService.uploadFile(document);
  99. return ResultUtil.success("上传成功",documentVO);
  100. }
  101. private void deleteFile(String filePath) {
  102. if (filePath == null || filePath.isEmpty()) {
  103. return;
  104. }
  105. try {
  106. Path path = Paths.get(filePath);
  107. boolean deleted = Files.deleteIfExists(path);
  108. if (deleted) {
  109. System.out.println("文件删除成功: " + filePath);
  110. } else {
  111. System.out.println("文件不存在或已被删除: " + filePath);
  112. }
  113. } catch (IOException e) {
  114. System.err.println("删除文件时发生错误: " + e.getMessage());
  115. e.printStackTrace();
  116. }
  117. }
  118. /** 下载文件 */
  119. @GetMapping("/download/{fileName}")
  120. @ApiOperation("文件下载")
  121. public void downloadFile(@PathVariable String fileName, @RequestParam String caseId, @RequestParam String fileType, HttpServletResponse response)throws IOException{
  122. String path = config.getUploadDir() + caseId + "/" + fileType + "/" ;
  123. File file = new File(path, fileName);
  124. if (!file.exists()) {
  125. response.sendError(HttpServletResponse.SC_NOT_FOUND, "文件不存在");
  126. return;
  127. }
  128. response.setContentType(Files.probeContentType(file.toPath()));
  129. response.setHeader("Content-Disposition",
  130. "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
  131. try (InputStream in = new FileInputStream(file);
  132. OutputStream out = response.getOutputStream()) {
  133. byte[] buffer = new byte[8192];
  134. int len;
  135. while ((len = in.read(buffer)) != -1) {
  136. out.write(buffer, 0, len);
  137. }
  138. }
  139. }
  140. /** 删除文件 */
  141. @DeleteMapping("/delete/{caseId}/{type}")
  142. @ApiOperation("文件删除")
  143. public Result deleteFileByFileName(@RequestParam String fileName ,@PathVariable Long caseId, @PathVariable String fileType) {
  144. String newUploadDir = config.getUploadDir() + caseId + "/" + fileType;
  145. File file = new File(newUploadDir, fileName);
  146. if (!file.exists())
  147. return ResultUtil.error(ExceptionEnum.FILE_NOT_EXIST);
  148. boolean isDelete = file.delete();
  149. if (!isDelete)
  150. return ResultUtil.error(ExceptionEnum.FILE_DELETE_ERROR);
  151. return ResultUtil.success("文件删除成功");
  152. }
  153. @GetMapping("/{caseId}")
  154. @ApiOperation("获取文件列表(type可选)")
  155. public Result getFileList(@PathVariable Long caseId, @RequestParam(required = false) String type){
  156. List<DocumentVO> files = fileService.findByCaseId(caseId);
  157. if(StrUtil.isBlank( type))
  158. return ResultUtil.success("success",files);
  159. List<DocumentVO> fileList = new ArrayList<>();
  160. for(DocumentVO file : files){
  161. if(file.getDictType().equals( type))
  162. fileList.add(file);
  163. }
  164. return ResultUtil.success("success",fileList);
  165. }
  166. }