diff --git a/src/main/java/edu/whut/smilepicturebackend/SmilePictureBackendApplication.java b/src/main/java/edu/whut/smilepicturebackend/SmilePictureBackendApplication.java index b510a0d..3fbbff2 100644 --- a/src/main/java/edu/whut/smilepicturebackend/SmilePictureBackendApplication.java +++ b/src/main/java/edu/whut/smilepicturebackend/SmilePictureBackendApplication.java @@ -3,8 +3,10 @@ package edu.whut.smilepicturebackend; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication +@EnableAsync @MapperScan("edu.whut.smilepicturebackend.mapper") public class SmilePictureBackendApplication { diff --git a/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java b/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java index d4c0f0f..8403ebd 100644 --- a/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java +++ b/src/main/java/edu/whut/smilepicturebackend/controller/PictureController.java @@ -91,6 +91,8 @@ public class PictureController { // 操作数据库 boolean result = pictureService.removeById(id); ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR); + //清理图片资源 + pictureService.clearPictureFile(oldPicture); return ResultUtils.success(true); } diff --git a/src/main/java/edu/whut/smilepicturebackend/manager/upload/PictureUploadTemplate.java b/src/main/java/edu/whut/smilepicturebackend/manager/upload/PictureUploadTemplate.java index dddf226..d373d1b 100644 --- a/src/main/java/edu/whut/smilepicturebackend/manager/upload/PictureUploadTemplate.java +++ b/src/main/java/edu/whut/smilepicturebackend/manager/upload/PictureUploadTemplate.java @@ -13,6 +13,7 @@ import edu.whut.smilepicturebackend.exception.BusinessException; import edu.whut.smilepicturebackend.exception.ErrorCode; import edu.whut.smilepicturebackend.manager.CosManager; import edu.whut.smilepicturebackend.model.file.UploadPictureResult; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import javax.annotation.Resource; diff --git a/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java b/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java index 13969c9..fba9e72 100644 --- a/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java +++ b/src/main/java/edu/whut/smilepicturebackend/service/PictureService.java @@ -102,4 +102,12 @@ public interface PictureService extends IService { * @return */ Page listPictureVOByPageWithCache(PictureQueryRequest queryRequest, HttpServletRequest httpRequest); + + + /** + * 清理图片文件 + * + * @param oldPicture + */ + void clearPictureFile(Picture oldPicture); } diff --git a/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java b/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java index b0cfcf1..fdd1bb4 100644 --- a/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java +++ b/src/main/java/edu/whut/smilepicturebackend/service/impl/PictureServiceImpl.java @@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import edu.whut.smilepicturebackend.exception.BusinessException; import edu.whut.smilepicturebackend.exception.ErrorCode; import edu.whut.smilepicturebackend.exception.ThrowUtils; +import edu.whut.smilepicturebackend.manager.CosManager; import edu.whut.smilepicturebackend.manager.FileManager; import edu.whut.smilepicturebackend.manager.cache.MyCacheManager; import edu.whut.smilepicturebackend.manager.upload.FilePictureUpload; @@ -37,6 +38,7 @@ import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.springframework.beans.BeanUtils; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.util.DigestUtils; @@ -64,6 +66,7 @@ public class PictureServiceImpl extends ServiceImpl private final FilePictureUpload filePictureUpload; private final UrlPictureUpload urlPictureUpload; private final MyCacheManager cacheManager; + private final CosManager cosManager; @Override public void validPicture(Picture picture) { ThrowUtils.throwIf(picture == null, ErrorCode.PARAMS_ERROR); @@ -132,6 +135,7 @@ public class PictureServiceImpl extends ServiceImpl picture.setEditTime(new Date()); } boolean result = this.saveOrUpdate(picture); + //todo:如果是更新,清理旧的图片 ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR, "图片上传失败,数据库操作失败"); return PictureVO.objToVo(picture); } @@ -410,6 +414,32 @@ public class PictureServiceImpl extends ServiceImpl expire ); } + + @Async //异步执行 + @Override + public void clearPictureFile(Picture oldPicture) { + // 判断改图片是否被多条记录使用(图片秒传的情况可能一个cos地址对应多个数据库url) + String pictureUrl = oldPicture.getUrl(); + long count = this.lambdaQuery() + .eq(Picture::getUrl, pictureUrl) + .count(); + // 有不止一条记录用到了该图片,不清理 + if (count > 1) { + return; + } + // 删除图片 + cosManager.deleteObject(pictureUrl); + //删除原图 + String originalUrl=oldPicture.getOriginalUrl(); + if (StrUtil.isNotBlank(originalUrl)) { + cosManager.deleteObject(originalUrl); + } + // 删除缩略图 + String thumbnailUrl = oldPicture.getThumbnailUrl(); + if (StrUtil.isNotBlank(thumbnailUrl)) { + cosManager.deleteObject(thumbnailUrl); + } + } }