V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
supuwoerc
V2EX  ›  问与答

文件上传的一点疑惑,大佬们进来讨论讨论

  •  
  •   supuwoerc · 2021-09-06 17:34:13 +08:00 · 888 次点击
    这是一个创建于 1152 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近自己在翻新博客,遇到了个痛点,旧博客的文件上传之后我是不会去删除这个文件的,每次更新或者添加都是只更新数据库的字段,实际文件夹里面的文件是不会删除的,但是重构的时候我考虑到这个问题了,没法在文件夹中分辨出哪些文件是无用的,哪些是有用的。

    于是新的数据库设计文件上传这块的时候我先把这条上传记录的 active 字段设为 0,保存表单时去设置 active 为 1,然后弄个定时任务去删除 active 为 0 对应的文件。

    就在刚刚,我又想到一个问题,如果我文件上传完到保存表单之间定时任务把这个上传的文件给删了怎么办?!那岂不是文件就 404 了。。

    一下就陷入了迷茫之中。。。难以自拔。

    PS:大佬可以说一下合理的做法,小弟我是个前端,只会玩点简单的 SpringBoot(),最近学习到 Quartz,所以打算翻新自己的博客练手加折腾两不误,轻喷~~~

    XiaoxiaoPu
        1
    XiaoxiaoPu  
       2021-09-06 17:39:20 +08:00
    简单点,定时任务只删除创建时间在一段时间之前的文件,比如只删除一天之前创建的且 active 为 0 的文件
    Vegetable
        2
    Vegetable  
       2021-09-06 17:44:57 +08:00
    真迷惑哈,diff 一下,删掉没有引用的文件就行了啊,既然你已经读库了,直接两个条件:数据库中没有引用,且上传超过 N 分钟,就删除。脚本设置全量和增量,第一次跑全量,定时任务跑增量。
    supuwoerc
        3
    supuwoerc  
    OP
       2021-09-06 17:47:45 +08:00
    @XiaoxiaoPu 感谢大佬回复,这确实是个办法,不过极端点的情况就是文件上传是 23:30,编辑好表单点击保存的时间是 00:01,这样跨越时间范围但又在删除情况之内的咋办呢?是否只能扩大这个时间来容忍这种情况呢?(比如一个表单开了一天再去保存)。
    eason1874
        4
    eason1874  
       2021-09-06 17:50:59 +08:00
    @supuwoerc #3 “一天之前”不是“前一天”,一天以前是 time() - 24*60*60,不存在你说的 11 点 59 分过一分钟就是过了一天的问题。

    有一种做法是:文件归文件,引用归引用;文件只要上传了不管有没有引用就在媒体库,当有文章引用时就标记被引用;媒体库可以筛选未被引用的文件,手动决定要不要清理。
    supuwoerc
        5
    supuwoerc  
    OP
       2021-09-06 17:53:08 +08:00
    @Vegetable @XiaoxiaoPu 感谢二位大佬解答,我这就去改一改 =。=
    supuwoerc
        6
    supuwoerc  
    OP
       2021-09-06 17:54:45 +08:00
    @eason1874 嗯嗯,感谢大佬,学到了,我太傻了,也没遇到过这种问题,学习了
    FieldFarmer
        7
    FieldFarmer  
       2021-09-06 18:03:30 +08:00
    以当前时间为准,之前未被引用的文件,一定是无用文件;之后的文件,取决于你希望临时上传的文件有效期是多少,举个例子,我上传一个文件,但是没保存表单,那么有用无用取决于多久之后我需不需要保存它,这就具有不确定性,你怎么能交给定时任务来判断。要是我,我直接定一个小时的有效期,上传的文件在一个小时内没有被引用,即可删除然后保存表单时校验文件是否还存在,不存在就提示文件已过有效期重新上传,仍然存在就直接保存(不考虑定时任务和保存表单并发情况)。
    supuwoerc
        8
    supuwoerc  
    OP
       2021-09-06 18:12:21 +08:00
    @FieldFarmer 感谢大佬回复,大家都提到了定一个过期时间来处理这个问题,学习到这个思路了!~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2561 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 04:31 · PVG 12:31 · LAX 21:31 · JFK 00:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.