diff --git a/src/main/java/com/imyeyu/api/modules/common/bean/TempFileMetaData.java b/src/main/java/com/imyeyu/api/modules/common/bean/TempFileMetaData.java index ffde520..4f44ef0 100644 --- a/src/main/java/com/imyeyu/api/modules/common/bean/TempFileMetaData.java +++ b/src/main/java/com/imyeyu/api/modules/common/bean/TempFileMetaData.java @@ -20,4 +20,7 @@ public class TempFileMetaData { private Path path; private Long lastAccessAt; + + /** 缓存时长(毫秒) */ + private Long ttl; } diff --git a/src/main/java/com/imyeyu/api/modules/common/controller/CommonController.java b/src/main/java/com/imyeyu/api/modules/common/controller/CommonController.java index 56ea98c..e0bbfbf 100644 --- a/src/main/java/com/imyeyu/api/modules/common/controller/CommonController.java +++ b/src/main/java/com/imyeyu/api/modules/common/controller/CommonController.java @@ -380,13 +380,14 @@ public class CommonController { /** * 上传临时文件 * - * @param files - * @return + * @param files 文件列表 + * @param ttl 缓存时长(毫秒),最长 3 天(259200000ms) + * @return 临时文件响应列表 */ @AOPLog @PostMapping("/temp/file/upload") - public List uploadFile(@RequestParam("file") List files) { - return tempFileService.store(files); + public List tempFileUpload(@RequestParam("file") List files, @RequestParam("ttl") Long ttl) { + return tempFileService.store(files, ttl); } /** diff --git a/src/main/java/com/imyeyu/api/modules/common/service/TempFileService.java b/src/main/java/com/imyeyu/api/modules/common/service/TempFileService.java index bcac81d..22c3590 100644 --- a/src/main/java/com/imyeyu/api/modules/common/service/TempFileService.java +++ b/src/main/java/com/imyeyu/api/modules/common/service/TempFileService.java @@ -15,7 +15,7 @@ import java.util.List; */ public interface TempFileService { - List store(List files) throws TimiException; + List store(List files, Long ttl) throws TimiException; File get(String id) throws TimiException; diff --git a/src/main/java/com/imyeyu/api/modules/common/service/implement/TempFileServiceImplement.java b/src/main/java/com/imyeyu/api/modules/common/service/implement/TempFileServiceImplement.java index f9ddfd2..3c8ce16 100644 --- a/src/main/java/com/imyeyu/api/modules/common/service/implement/TempFileServiceImplement.java +++ b/src/main/java/com/imyeyu/api/modules/common/service/implement/TempFileServiceImplement.java @@ -43,7 +43,8 @@ import java.util.concurrent.ConcurrentHashMap; @RequiredArgsConstructor public class TempFileServiceImplement implements TempFileService { - private static final Long TTL = Time.H * 6; + private static final Long DEFAULT_TTL = Time.H * 6; + private static final Long MAX_TTL = Time.D * 3; private static final Long LIMIT = IOSize.GB * 10; private final SettingService settingService; @@ -61,7 +62,10 @@ public class TempFileServiceImplement implements TempFileService { Files.createDirectories(storagePath); } - public List store(List files) throws TimiException { + public List store(List files, Long ttl) throws TimiException { + ttl = TimiJava.firstNotNull(ttl, DEFAULT_TTL); + TimiException.requiredTrue(0 < ttl && ttl <= MAX_TTL, "ttl must be between 1ms and 3 days(259200000ms)"); + long newFileSize = files.stream().mapToLong(MultipartFile::getSize).sum(); long currentUsage = usageMap.getOrDefault(TimiSpring.getRequestIP(), 0L); TimiException.requiredTrue(currentUsage + newFileSize < LIMIT, "out of storage limit(10 GB)"); @@ -86,11 +90,12 @@ public class TempFileServiceImplement implements TempFileService { metadata.setName(fileName); metadata.setOriginalName(file.getOriginalFilename()); metadata.setLastAccessAt(Time.now()); + metadata.setTtl(ttl); metadataMap.put(metadata.getId(), metadata); TempFileResponse resp = new TempFileResponse(); resp.setId(metadata.getId()); - resp.setExpireAt(metadata.getLastAccessAt() + TTL); + resp.setExpireAt(metadata.getLastAccessAt() + ttl); usageMap.put(TimiSpring.getRequestIP(), currentUsage + newFileSize); result.add(resp); @@ -128,7 +133,7 @@ public class TempFileServiceImplement implements TempFileService { public void cleanup() { List expiredIds = metadataMap.values() .stream() - .filter(metadata -> metadata.getLastAccessAt() + TTL < Time.now()) + .filter(metadata -> metadata.getLastAccessAt() + metadata.getTtl() < Time.now()) .map(TempFileMetaData::getId) .toList(); for (int i = 0; i < expiredIds.size(); i++) {