fileStorageUpload 组件文件上传的那些废文件你们是怎么清理的?

  1. 实体删除了文件还在
  2. fileStoragePutMode=“IMMEDIATE”(默认)的话一上传文件就保存了,不管你有没有使用

长久下去就会产生很多废文件,请问你们是怎么处理这个问题的?

要实际删除上传文件需要

@Autowired
private FileStorageLocator storageLocator;

storageLocator.getByName(file.getStorageName()).removeFile(file);

实体删除如果手动调用删除文件代码的话,那可恢复的实体就惨了,文件丢失!

这个问题我忍了很久了 :joy:,有没有系统的清理支持啊!

我的处理方法,又没有更好的方法?这种不是很优雅的感觉 :relieved:

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());

}
2 个赞