FilesServiceImpl.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package com.ruoyi.file.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.ruoyi.file.mapper.FilesMapper;
  7. import com.usky.common.core.bean.CommonPage;
  8. import com.usky.common.security.utils.SecurityUtils;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.stereotype.Service;
  12. import org.springframework.web.multipart.MultipartFile;
  13. import javax.servlet.ServletOutputStream;
  14. import javax.servlet.http.HttpServletResponse;
  15. import java.io.*;
  16. import java.net.URLEncoder;
  17. import java.time.LocalDateTime;
  18. import java.time.format.DateTimeFormatter;
  19. @Service
  20. public class FilesServiceImpl extends ServiceImpl<FilesMapper, FilesUpload> implements FilesService {
  21. @Value("${file.path}")
  22. private String filesUploadPath;//获取文件路径
  23. @Value("${file.domain}")
  24. private String filesUploadDomain;//文件域名
  25. @Value("${file.prefix}")
  26. private String filesPrefix;//文件前缀
  27. @Override
  28. public FileUploadResponse upload(MultipartFile file) {
  29. // 获取当前登录用户昵称(如果可用)
  30. String userName = SecurityUtils.getUsername();
  31. // 文件夹路径名称
  32. String originalFilename = file.getOriginalFilename();
  33. //文件大小
  34. double size = file.getSize() / (1024.0);
  35. // 获取当前日期时间
  36. LocalDateTime now = LocalDateTime.now();
  37. String timestamp = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
  38. //文件类型
  39. String type = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
  40. // 按照年月创建文件夹
  41. String yearMonth = now.format(DateTimeFormatter.ofPattern("yyyyMM"));
  42. // 获取每月递增值
  43. int monthIncrement = getMonthIncrement(yearMonth);
  44. // 新文件名格式:时间戳+每月递增值+文件类型
  45. String fileUuid = timestamp + "A" + String.format("%04d", monthIncrement) + "." + type;
  46. // 将相对路径转化为绝对路径
  47. String destPath = filesUploadPath + "/" + yearMonth;
  48. // 新的文件地址,绝对路径+新的文件名称
  49. File uploadFile = new File(destPath + "/" + fileUuid);
  50. // 判断配置的文件目录是否存在,若不存在则创建一个新的文件目录
  51. File parentFile = uploadFile.getParentFile();
  52. if (!parentFile.exists()) {
  53. parentFile.mkdirs();
  54. }
  55. try {
  56. // 存储文件到本地磁盘
  57. file.transferTo(uploadFile);
  58. // 设置文件url
  59. String url = filesUploadDomain + filesPrefix + "/" + yearMonth + "/" + fileUuid;
  60. // 将文件存储到数据库
  61. FilesUpload saveFile = new FilesUpload();
  62. saveFile.setFilesName(originalFilename);
  63. saveFile.setName(fileUuid);
  64. saveFile.setPath(destPath);
  65. saveFile.setType(type);
  66. saveFile.setSize(size); // (单位:KB)
  67. saveFile.setUrl(url);
  68. saveFile.setEnable(true);
  69. saveFile.setIsDelete(0);
  70. saveFile.setCreateBy(userName);
  71. saveFile.setCreateTime(LocalDateTime.now());
  72. saveFile.setUpdateBy(null);
  73. saveFile.setUpdateTime(null);
  74. // 保存操作
  75. save(saveFile);
  76. // 返回 FileUploadResponse 对象
  77. return new FileUploadResponse(originalFilename, url);
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. return null;
  81. }
  82. }
  83. /**
  84. * 获取每月递增值
  85. * @param yearMonth 年月(格式:yyyyMM)
  86. * @return 递增值
  87. */
  88. private int getMonthIncrement(String yearMonth) {
  89. // 目标文件夹路径
  90. String destPath = filesUploadPath + "/" + yearMonth;
  91. File folder = new File(destPath);
  92. // 如果文件夹不存在,则递增值从1开始
  93. if (!folder.exists()) {
  94. folder.mkdirs();
  95. return 1;
  96. }
  97. // 获取文件夹中已有的文件数量
  98. File[] files = folder.listFiles();
  99. if (files == null || files.length == 0) {
  100. return 1;
  101. }
  102. // 递增值为文件夹中现有文件数量 + 1
  103. return files.length + 1;
  104. }
  105. @Override
  106. public void deleteFile(Integer id) {
  107. try {
  108. // 根据 id 查询文件信息
  109. FilesUpload file = getById(id);
  110. if (file == null) {
  111. throw new RuntimeException("文件不存在,无法删除");
  112. }
  113. // 删除本地文件
  114. String filePath = file.getPath() + "/" + file.getName();
  115. File localFile = new File(filePath);
  116. if (localFile.exists()) {
  117. if (!localFile.delete()) {
  118. throw new RuntimeException("文件删除失败");
  119. }
  120. }
  121. // 更新数据库记录
  122. FilesUpload updateFile = new FilesUpload();
  123. updateFile.setId(file.getId());
  124. updateFile.setFilesName(file.getFilesName());
  125. updateFile.setName(file.getName());
  126. updateFile.setPath(file.getPath());
  127. updateFile.setType(file.getType());
  128. updateFile.setSize(file.getSize());
  129. updateFile.setUrl(file.getUrl());
  130. updateFile.setEnable(false);
  131. updateFile.setIsDelete(1); // 设置为已删除
  132. updateFile.setCreateBy(file.getCreateBy());
  133. updateFile.setCreateTime(file.getCreateTime()); // 保留原始的 createTime
  134. updateFile.setUpdateBy(file.getUpdateBy());
  135. updateFile.setUpdateTime(LocalDateTime.now());
  136. // 提交更新到数据库
  137. updateById(updateFile); // 调用 updateById 方法更新数据库记录
  138. } catch (Exception e) {
  139. throw new RuntimeException("删除文件失败:" + e.getMessage());
  140. }
  141. }
  142. @Override
  143. public CommonPage<FilesUpload> queryFiles(String filesName, LocalDateTime startTime, LocalDateTime endTime, Boolean isDeleted, String fileType, int current, int size) {
  144. QueryWrapper<FilesUpload> queryWrapper = new QueryWrapper<>();
  145. // 默认查询未删除的文件
  146. if (isDeleted == null) {
  147. queryWrapper.eq("is_delete", 0);
  148. } else {
  149. queryWrapper.eq("is_delete", isDeleted ? 1 : 0);
  150. }
  151. if (filesName != null && !filesName.isEmpty()) {
  152. queryWrapper.like("files_name", filesName);
  153. }
  154. if (startTime != null && endTime != null) {
  155. queryWrapper.ge("create_time", startTime); // 大于等于起始时间
  156. queryWrapper.le("create_time", endTime); // 小于等于结束时间
  157. } else if (startTime != null) {
  158. queryWrapper.ge("create_time", startTime); // 只有起始时间
  159. } else if (endTime != null) {
  160. queryWrapper.le("create_time", endTime); // 只有结束时间
  161. }
  162. if (fileType != null && !fileType.isEmpty()) {
  163. queryWrapper.eq("type", fileType);
  164. }
  165. // 按照创建时间倒序排列
  166. queryWrapper.orderByDesc("create_time");
  167. // 创建分页请求对象
  168. Page<FilesUpload> page = new Page<>(current, size);
  169. // 执行分页查询
  170. IPage<FilesUpload> iPage = baseMapper.selectPage(page, queryWrapper);
  171. // 将 MyBatis Plus 的 IPage 转换为 CommonPage
  172. CommonPage<FilesUpload> commonPage = new CommonPage<>();
  173. commonPage.setRecords(iPage.getRecords());
  174. commonPage.setTotal(iPage.getTotal());
  175. commonPage.setSize(iPage.getSize());
  176. commonPage.setCurrent(iPage.getCurrent());
  177. return commonPage;
  178. }
  179. private String getUserNameFromSecurityContext() {
  180. try {
  181. return SecurityUtils.getUsername();
  182. } catch (Exception e) {
  183. // 如果无法获取用户信息,记录日志并返回默认值或抛出自定义异常
  184. return "未知用户";
  185. }
  186. }
  187. }