3.17 图片存储优化,删除cos上无引用的图片

This commit is contained in:
zhangsan 2025-03-17 14:28:02 +08:00
parent 6fcfd80e51
commit 0fd9ef2e83
5 changed files with 43 additions and 0 deletions

View File

@ -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 {

View File

@ -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);
}

View File

@ -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;

View File

@ -102,4 +102,12 @@ public interface PictureService extends IService<Picture> {
* @return
*/
Page<PictureVO> listPictureVOByPageWithCache(PictureQueryRequest queryRequest, HttpServletRequest httpRequest);
/**
* 清理图片文件
*
* @param oldPicture
*/
void clearPictureFile(Picture oldPicture);
}

View File

@ -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<PictureMapper, Picture>
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<PictureMapper, Picture>
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<PictureMapper, Picture>
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);
}
}
}