- 实体删除了文件还在
- fileStoragePutMode=“IMMEDIATE”(默认)的话一上传文件就保存了,不管你有没有使用
长久下去就会产生很多废文件,请问你们是怎么处理这个问题的?
要实际删除上传文件需要
@Autowired
private FileStorageLocator storageLocator;
storageLocator.getByName(file.getStorageName()).removeFile(file);
长久下去就会产生很多废文件,请问你们是怎么处理这个问题的?
要实际删除上传文件需要
@Autowired
private FileStorageLocator storageLocator;
storageLocator.getByName(file.getStorageName()).removeFile(file);
实体删除如果手动调用删除文件代码的话,那可恢复的实体就惨了,文件丢失!
这个问题我忍了很久了 ,有没有系统的清理支持啊!
我的处理方法,又没有更好的方法?这种不是很优雅的感觉
1.实体监听EntityChangedEvent
事件,用来移除旧文件。
private static final Logger log = org.slf4j.LoggerFactory.getLogger(SiteFileEventListener.class);
@Autowired
private FileStorageLocator storageLocator;
@EventListener
public void onSiteFileChangedBeforeCommit(final EntityChangedEvent<SiteFile> event) {
var changes = event.getChanges();
var attributes = changes.getAttributes();
if (attributes.contains("file")) {
// 清理旧文件
FileRef file = changes.getOldValue("file");
if (file == null) {
return;
}
storageLocator.getByName(file.getStorageName()).removeFile(file);
log.info("清理旧文件:" + file.getFileName());
}
}
2.页面监听AfterCloseEvent
事件,用来处理临时文件。
@Subscribe
public void onAfterClose(final AfterCloseEvent event) {
var action = (StandardCloseAction) event.getCloseAction();
if (action.isCheckForUnsavedChanges()) {
return;
}
var entity = getEditedEntity();
var file = entity.getFile();
var siteFile = dataManager.load(SiteFile.class).id(entity.getId()).optional();
if (siteFile.isEmpty()) {
return;
}
var oldFile = siteFile.get().getFile().getFileName();
var newFile = fileField.getFileName();
// 没有动文件那种
if (oldFile.equals(newFile)) {
return;
}
// 清理临时文件
storageLocator.getByName(file.getStorageName()).removeFile(file);
log.info("清理临时文件:" + file.getFileName());
}