liding
2025-05-15 7aa33e4e6f5dd36d6a67b1b1e59c5d276e740486
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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());
    }
}