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<TempFileMapper, TempFile> implements TempFileService {
|
|
@Autowired
|
private TempFileMapper tempFileMapper;
|
|
@Value("${file.temp-dir}")
|
private String tempDir;
|
|
// 上传到临时目录
|
@Override
|
public TempFile uploadFile(MultipartFile file,String type) 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小时后过期
|
tempFileRecord.setType(type);
|
tempFileMapper.insert(tempFileRecord);
|
|
return tempFileRecord;
|
}
|
|
@Scheduled(cron = "0 0 3 * * ?") // 每天凌晨3点执行
|
public void cleanupExpiredTempFiles() {
|
LambdaQueryWrapper<TempFile> wrapper = new LambdaQueryWrapper<>();
|
wrapper.lt(TempFile::getExpireTime, LocalDateTime.now()); // expireTime < 当前时间
|
|
List<TempFile> 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());
|
}
|
}
|