package com.ruoyi.other.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.other.service.TempFileService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; import java.util.List; import java.util.UUID; @Service @Slf4j public class TempFileServiceImpl extends ServiceImpl implements TempFileService { @Autowired private TempFileMapper tempFileMapper; @Value("${file.temp-dir}") private String tempDir; // 上传到临时目录 @Override public TempFile uploadFile(MultipartFile file) throws IOException { // 1. 生成临时文件ID和路径 String tempId = UUID.randomUUID().toString(); Path tempFilePath = Paths.get(tempDir, tempId + "_" + file.getOriginalFilename()); // 2. 确保目录存在 Path parentDir = tempFilePath.getParent(); if (parentDir != null) { Files.createDirectories(parentDir); // 递归创建目录 } // 3. 保存文件到临时目录 file.transferTo(tempFilePath.toFile()); // 4. 保存临时文件记录 TempFile tempFileRecord = new TempFile(); tempFileRecord.setTempId(tempId); tempFileRecord.setOriginalName(file.getOriginalFilename()); tempFileRecord.setTempPath(tempFilePath.toString()); tempFileRecord.setExpireTime(LocalDateTime.now().plusHours(2)); // 2小时后过期 tempFileMapper.insert(tempFileRecord); return tempFileRecord; } @Scheduled(cron = "0 0 3 * * ?") // 每天凌晨3点执行 public void cleanupExpiredTempFiles() { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.lt(TempFile::getExpireTime, LocalDateTime.now()); // expireTime < 当前时间 List expiredFiles = tempFileMapper.selectList(wrapper); for (TempFile file : expiredFiles) { try { // 删除物理文件 Files.deleteIfExists(Paths.get(file.getTempPath())); // 删除数据库记录 tempFileMapper.deleteById(file); log.info("已清理过期临时文件: {}", file.getTempPath()); } catch (IOException e) { log.error("删除文件失败: {}", file.getTempPath(), e); // 可选择记录失败日志或重试 } } log.info("过期临时文件清理完成,共清理 {} 个文件", expiredFiles.size()); } }