服务器垃圾图片的处理

各位开发者:
麻烦问个问题:
针对一些数据提交操作包含了 上传 文件的操作,用户在选择文件完成就会上传这个文件,然后返回一个地址给前端
但是如果用户中途取消操作之后,此时这个服务器上的文件就成了垃圾文件,针对这种情况大家是怎么处理的?

目前这边的解决办法是,上传文件的接口把路径存储到redis,然后用户具体操作数据的接口又把路径存到redis,然后有一个定时任务每天来比对两个redis的差值进行删除图片,但是这种的坏处是,同时需要两边都要操作,

我想的是单向操作 在上传文件这个接口就对这个文件URL路径进行标记,不用去操作具体的数据接口,这种有什么思路可以达到

定时删除就行了...

我是这么干的:在上传时将路径存到redis里,然后监听数据表的更改,将记录中的图片路径从redis里删掉。用定时任务扫描redis中的路径,将对应的图片删除。

如果业务不强制要求选择完图片以后可以预览,那直接和数据一起提交就行了,没必要分两次提交 

或者不要求兼容低版本的ie,那就直接h5的api就可以搞定了,预览的问题也能解决

A:上传文件并设置文件状态为未提交,未提交状态的文件被扫描时发现过期(设置一个未提交状态文件的存活时间)了删除。

B:数据处理提交时,先去设置下文件状态为提交状态,再完成数据处理。这样数据处理取消的那些文件就是未提交状态,会被垃圾回收。

上传后存草稿箱,客户删除就把文件删除

感谢大家的回答

我有一个不成熟的想法:相当于集中管理式

【单向操作服务器垃圾图片处理】
1.AOP方式 

Annotation   -  @RubbishPicDisposal   -     上传文件后存储文件访问路径至RubbishPicStorager

Class        -  RubbishPicStorager.java  -  主要用于存储上传文件上传完成后的访问路径 和 上传时间

Class        -  RubbishPicCleaner.java 	 -  主要用于定时检查清理垃圾图片(定时任务)

Class        -  RubbishPicAspect.java    -  监听提交方法切面 需要 把 【方法类路径】 和【 请求参数(请求参数需要是一个Object,可被反射)中存储 文件路径 列字段的名称】 对应关系静态配置 给 保存到RubbishPicAspect中, 对所有 【方法类路径】 方法进行切面

具体业务:

1.即每一个上传文件接口增加一个注解@RubbishPicDisposal  这个注解代表了该文件上传接口会把上传后的文件路径存储到RubbishPicStorager中
2.通过RubbishPicAspect 切面类 监听到 业务方法执行时,通过 类路径方法对应的关系标识 取出 列字段名称,反射拿到请求参数 并且通过 列字段名称 拿到 对应的文件路径
3.在RubbishPicAspect切面类中通过上面的文件路径,在RubbishPicStorager判断 如果存在这个访问路径,那么说明前端操作(上传文件和提交数据) 是一次性,则移除RubbishPicStorager中的这个文件访问路径
4.RubbishPicCleaner中 定时 检查 RubbishPicStorager中文件访问路径的 上传时间 和当前时间 对比 如果该访问路径超过指定的时间(比如30分钟)说明30分钟内,该次操作未进行提交,则根据文件访问路径从服务器上面删除

这样只需要在服务启动前统一配置提交数据 会带 文件访问路径的接口,
并且上传文件的接口仅仅加个@RubbishPicDisposal 注解就完事了

存在问题:
1.未经测试,不清楚高并发下面会不会出现问题
2.对于数据性的原子性操作要求非常高
3.如果用户上传文件后一直停留在页面,30分钟后再次提交数据,没做任何验证的话,该文件访问路径已经无效
4.需要在服务启动前,把所有需要提交 文件访问路径 的接口 静态配置在RubbishPicAspect
5.RubbishPicStorager中的文件访问路径需要持久化操作,不然重启服务会丢失

 

和参数一起提交上传啊, 想要预览有h5的api  上传的file对象中 有blob地址

具体业务三  别人上传文件你保存之后可定会存在这个文件的访问路径吧  那你不也从RubbishPicStorager里删除了(除非别人上传完成前你会用位置 完成后修改这个文件位置?但是你就算是没完成是这个访问路劲也是存在的吧)

 

如果这个东西存在服务本地缓存里那么 高并发可定会存在丢失的问题