ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOssMapper.java
@@ -18,4 +18,6 @@ public interface SysOssMapper extends BaseMapperPlus<SysOss, SysOssVo> { List<Long> getWillDeleted(@Param("maxTime") LocalDateTime maxTime); void deleteIds(@Param("ids") List<Long> ids); } ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/sync/VideoPulSync.java
@@ -23,6 +23,7 @@ import org.springframework.mock.web.MockMultipartFile; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -31,6 +32,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Objects; @Slf4j @Component @@ -48,26 +50,26 @@ @Scheduled(cron = "0 0/1 * * * ?") public void get() throws IOException { System.out.println("同步上传......"); log.info("同步上传"); log.error("同步上传"); List<String> list = FtpApche.downloadList(ftpConfig); if(list.size() == 0){ if(CollectionUtils.isEmpty(list)){ log.error("no files in ftp"); System.out.println("ftp get 0 fileinfo"); return; } System.out.println("ftp get all fileinfo:" + list.get(0)); log.info("ftp get all fileinfo:" + list.get(0)); for (String str : list) { String password = str.substring(0, 6); String fileName = str.substring(6, str.length()); InputStream input = FtpApche.downloadFileFromDailyDir(str); byte[] fileBytesByName = FtpApche.getFileBytesByName(input); OssClient storage = OssFactory.instance(); MockMultipartFile mockMultipartFile = new MockMultipartFile(fileName, fileName, fileName.substring(14, fileName.length()), input); UploadResult uploadResult = storage.uploadSuffix2(fileBytesByName, getPath(fileName), "multipart/form-data; charset=ISO-8859-1"); FtpApche.deleteFile(str); buildResultEntity(fileName, fileName.substring(14, fileName.length()), "minio", uploadResult, (MultipartFile)mockMultipartFile, password, fileBytesByName); if (Objects.nonNull(input)) { byte[] fileBytesByName = FtpApche.getFileBytesByName(input); OssClient storage = OssFactory.instance(); MockMultipartFile mockMultipartFile = new MockMultipartFile(fileName, fileName, fileName.substring(14, fileName.length()), input); UploadResult uploadResult = storage.uploadSuffix2(fileBytesByName, getPath(fileName), "multipart/form-data; charset=ISO-8859-1"); buildResultEntity(fileName, fileName.substring(14, fileName.length()), "minio", uploadResult, (MultipartFile)mockMultipartFile, password, fileBytesByName); FtpApche.deleteFile(str); } } } ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/sync/deleteSync.java
@@ -1,6 +1,9 @@ package org.dromara.system.sync; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.dromara.common.oss.core.OssClient; import org.dromara.common.oss.factory.OssFactory; import org.dromara.system.domain.SysOss; import org.dromara.system.domain.properties.Boundary; import org.dromara.system.domain.vo.SysOssVo; @@ -12,7 +15,9 @@ import java.io.IOException; import java.time.LocalDateTime; import java.util.List; import java.util.Objects; @Slf4j @Component public class deleteSync { @@ -27,30 +32,43 @@ @Scheduled(cron = "0 */10 * * * ?") public void remove() throws IOException { System.out.println("同步删除......"); log.error("同步删除......"); List<Long> ids = baseMapper.getWillDeleted(LocalDateTime.now().minusDays(1)); if (ids.size() == 0) { return; } OssClient ossClient = OssFactory.instance(); for (Long ossId : ids) { SysOss sysOss = baseMapper.selectById(ossId); if (Objects.nonNull(sysOss)) { ossClient.delete(sysOss.getFileName()); } HttpUtils.sendDeleteRequest(boundary.getVideo() + "/resource/synchronization/delete", String.valueOf(ossId)); } } /** * 每小时删除30天之前的文件信息,确保上面的定时任务不会因为停电关机等原因导致文件未被删除 * 每小时删除2天之前的文件信息,因为上面的同步删除并不能保证事务 * * @throws IOException */ @Scheduled(cron = "0 0 * * * ?") public void removeOssTable() throws IOException { System.out.println("每小时定时删除超过30天的数据库文件信息......"); List<Long> ids = baseMapper.getWillDeleted(LocalDateTime.now().minusDays(30)); log.error("每小时定时删除超过2天的数据库文件信息......"); List<Long> ids = baseMapper.getWillDeleted(LocalDateTime.now().minusDays(2)); if (ids.size() == 0) { return; } baseMapper.deleteBatchIds(ids); // 删除对应文件 OssClient ossClient = OssFactory.instance(); for (Long ossId : ids) { SysOss sysOss = baseMapper.selectById(ossId); if (Objects.nonNull(sysOss)) { ossClient.delete(sysOss.getFileName()); } } baseMapper.deleteIds(ids); } } ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOssMapper.xml
@@ -6,4 +6,9 @@ SELECT oss_id from sys_oss WHERE create_time <= #{maxTime} </select> <delete id="deleteIds" parameterType="integer"> DELETE FROM sys_oss WHERE oss_id IN <foreach collection="ids" open="(" separator="," close=")" item="id">id</foreach> </delete> </mapper>