如何解决“上传了附件但是最后其实没用”这个问题?

查看 119|回复 9
作者:abcbuzhiming   
比如以论坛的发帖功能来讲,它有个上传附件功能,我上传了一个附件,但是我突然把这个页面关了,没点保存,于是这个上传的附件就是个废附件,实际没用,占空间。
那么有什么方法可以实现的好一点,清除掉这个没用的附件。
一个简单的思考方法,就是把上传的文件保存在一个临时目录里,然后当你要保存使用这个文件附件的实际内容的时候,移动这个文件到真正的保存目录。然后临时目录定期清理。
但是这个方法仍然存在缺陷,因为现实里不是所有的表单页面,都像论坛发帖这个页面一样,当你点下提交,整个页面提交内容到服务器后,就会关闭(或跳转到另外的页面)。
有一些表单页面很复杂,所以,允许用户一边保存,一边编辑,这类页面有个特点就是,点保存后只会有个提示告诉你提交了,你本人还是停留在这个编辑页面上。这种就没办法沿用上述那个[移动上传文件到正式保存路径]这个逻辑的。因为你挪动文件的路径后,第一就是页面访问这些文件的路径都会发生变化,这导致你必须更新本地页面上这些附件附图的访问路径,否则它们都会变成红 x 无法访问了。这种保存一次后,还必须更新页面上数据的方式,对某些有大量附件的表单特别不友好。
所以,还有没有更好的方案?

附件, 页面, 保存, 上传

minglanyu   
blob
shaojz2005   
上传有 2 种情况,一是提交前并未上传文件;二是选择文件后就上传了。现在的开发模式一般是第二种,遇到没用文件的问题,一般情况下是不管它,占用不了多大空间。
如果确实觉得有影响,可以定期跑个脚本,清理这些未在数据库中引用的文件。
paradoxs   
根据你自己的需求来弄呗, 如果你空间很紧张,那他退出页面的时候没提交附件,就立刻给他删了。
samnya   
我们是上传的文件也要写道数据库 file 表,然后表单保存的是 file id
这样的好处是可以检查到有没有引用文件,然后也可以映射,比如实际上是同时支持阿里云腾讯云 oss 或者服务器自存的,查 file 表之后才知道实际 url
JamesR   
1.定时脚本,每日跑一遍,删除创建时间超过 1 天的无用附件。
2.每次上传附件的接口,上传完毕的同时创建一个 Job ,2~3 小时后,Job 自动删除这个附件。适合欧洲等有数据要求严格的服务器(不能保存客户数据)。
yolee599   
上传的时候记录下来文件路径,每天定时脚本扫描当天上传的文件,没有是使用就删除
yimiaoxiehou   
引用计数啊,文件表里面进行引用计数,定期删除 0 的就行
cp19890714   
统一文件事务管理,所有文件在一个专门的“文件管理”功能中,通过“是否已提交”字段标识该文件是否有效。
* 文件上传后,正常存储,“是否已提交”为 false
* 业务表单 submit 后,调用文件管理接口“commit”,修改字段”是否已提交“为 true 。
* 定时任务,删除一段时间后依然无效的文件。
nothingistrue   
一般都是不管,因为存储成本真得很低。
我的预想方案如下。把所有附件,先转换成「资源」表的一个记录。资源表负责存储附件的相对路径,外部只能通过资源 ID 去关联附件。然后你就可以在资源表中维护附件的状态、关联性等,以及延时或者定期清理没有外部关联的资源记录和其对应的文件。因为「资源」个数据库表,它可以跟主业务保持事务一致性。资源表跟附件本身的一致性则需要额外保证,一般也只是保证从资源表到附件的单向一致性——只需要先保存文件再插数据,同时禁止外部删除文件即可。如果需要保证资源表跟附件的完全一致性,那开发成本将非常高。此方案仅存在与预想,因为参与过的老项目压根不会改,新项目涉及到开发时间就连我自己都不会上这种方案。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部