后端怎么清理已经没用的图片?

前后端分离的项目,有多处数据有附带图片。我写了一个专门用来上传图片的接口,产生一个图片的url存放到需要图片的数据表里。
这样用户如果修改了附件或者重传了,会产生很多没用的图片文件,有什么好的方案可以识别到这些无用的文件?

我现在的处理方法是在服务器上放了个定时任务,依次遍历这些数据表里的图片url,与目录下的图片文件名做对比,不在这些数据库里的就删除。但是这样需要把各个数据表硬编码到定时脚本里,感觉不够灵活。有没有比较通用的统一管理这些文件的方法?
阅读 7.9k
6 个回答

你应该再准备一个缓存池
图片上传先上传至缓存池 当图片与其他相关联的时候(真正被应用到,从缓存池移出至应用池 当修改或覆盖的时候就把应用池中的数据替换
再来个扫描任务 当数据待在缓存池超过一定时间就判定为垃圾数据 直接删除

用户如果修改了附件或者重传,把原来上传的删掉。或者每个用户上传的图片文件名加时间戳,用户文件夹里如果除去时间戳有相同名字的,保留最新时间戳的文件,删除其他的同名文件。

参考 巡云轻论坛 的做法,每上传一个文件就在指定目录生成一个文件锁(文件锁这个文本文件的名称由上传的文件名称和路径组成,文件里面没有内容),提交发表的内容后将文件锁删除。然后由定时任务遍历文件锁,超过时间(比如两小时)还存在的文件锁,就将文件锁对应的文件删除

我是这样的,前端上传的时候 图片放到临时文件夹里面(这个文件夹的图片 按时间1天后删除), 用户确定提交的时候找到临时文件夹对应的图片拷贝一份到新目录,入库并返回图片地址,用户编辑操作话的,找到原图地址删了, 在存一个新的就是拉。

定时删除同一用户相同类型的图片,只保留时间最近的一张

一、可以在数据库中维护表-图片url列的关系,然后定期删除没用的图片(删除时注意不要删除刚上传但还未在数据库中保存url的图片)
步骤1:创建一个表table_column_img存放哪些表的哪个列中有图片url
id, table, column
1,user,avatar
2,user,bg_img
步骤2:定时查询都有哪些表的列中有图片url
select table, column from table_column_img
步骤3:
查询具体表-列中的图片url地址
select avatar from user
select bg_img from user
二、用户修改图片url时去删除旧图片(可以写个触发器,修改,删除时把图片url放到一个表中,然后定期去删除图片)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题