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

209 天前
 abcbuzhiming
比如以论坛的发帖功能来讲,它有个上传附件功能,我上传了一个附件,但是我突然把这个页面关了,没点保存,于是这个上传的附件就是个废附件,实际没用,占空间。

那么有什么方法可以实现的好一点,清除掉这个没用的附件。

一个简单的思考方法,就是把上传的文件保存在一个临时目录里,然后当你要保存使用这个文件附件的实际内容的时候,移动这个文件到真正的保存目录。然后临时目录定期清理。

但是这个方法仍然存在缺陷,因为现实里不是所有的表单页面,都像论坛发帖这个页面一样,当你点下提交,整个页面提交内容到服务器后,就会关闭(或跳转到另外的页面)。
有一些表单页面很复杂,所以,允许用户一边保存,一边编辑,这类页面有个特点就是,点保存后只会有个提示告诉你提交了,你本人还是停留在这个编辑页面上。这种就没办法沿用上述那个[移动上传文件到正式保存路径]这个逻辑的。因为你挪动文件的路径后,第一就是页面访问这些文件的路径都会发生变化,这导致你必须更新本地页面上这些附件附图的访问路径,否则它们都会变成红 x 无法访问了。这种保存一次后,还必须更新页面上数据的方式,对某些有大量附件的表单特别不友好。

所以,还有没有更好的方案?
3392 次点击
所在节点    程序员
32 条回复
minglanyu
209 天前
blob
shaojz2005
209 天前
上传有 2 种情况,一是提交前并未上传文件;二是选择文件后就上传了。现在的开发模式一般是第二种,遇到没用文件的问题,一般情况下是不管它,占用不了多大空间。

如果确实觉得有影响,可以定期跑个脚本,清理这些未在数据库中引用的文件。
paradoxs
209 天前
根据你自己的需求来弄呗, 如果你空间很紧张,那他退出页面的时候没提交附件,就立刻给他删了。
samnya
209 天前
我们是上传的文件也要写道数据库 file 表,然后表单保存的是 file id
这样的好处是可以检查到有没有引用文件,然后也可以映射,比如实际上是同时支持阿里云腾讯云 oss 或者服务器自存的,查 file 表之后才知道实际 url
JamesR
209 天前
1.定时脚本,每日跑一遍,删除创建时间超过 1 天的无用附件。
2.每次上传附件的接口,上传完毕的同时创建一个 Job ,2~3 小时后,Job 自动删除这个附件。适合欧洲等有数据要求严格的服务器(不能保存客户数据)。
yolee599
209 天前
上传的时候记录下来文件路径,每天定时脚本扫描当天上传的文件,没有是使用就删除
yimiaoxiehou
209 天前
引用计数啊,文件表里面进行引用计数,定期删除 0 的就行
cp19890714
209 天前
统一文件事务管理,所有文件在一个专门的“文件管理”功能中,通过“是否已提交”字段标识该文件是否有效。
* 文件上传后,正常存储,“是否已提交”为 false
* 业务表单 submit 后,调用文件管理接口“commit”,修改字段”是否已提交“为 true 。
* 定时任务,删除一段时间后依然无效的文件。
nothingistrue
209 天前
一般都是不管,因为存储成本真得很低。

我的预想方案如下。把所有附件,先转换成「资源」表的一个记录。资源表负责存储附件的相对路径,外部只能通过资源 ID 去关联附件。然后你就可以在资源表中维护附件的状态、关联性等,以及延时或者定期清理没有外部关联的资源记录和其对应的文件。因为「资源」个数据库表,它可以跟主业务保持事务一致性。资源表跟附件本身的一致性则需要额外保证,一般也只是保证从资源表到附件的单向一致性——只需要先保存文件再插数据,同时禁止外部删除文件即可。如果需要保证资源表跟附件的完全一致性,那开发成本将非常高。此方案仅存在与预想,因为参与过的老项目压根不会改,新项目涉及到开发时间就连我自己都不会上这种方案。
justfindu
209 天前
文件表, 没有关联引用的, 用户上传的都删掉. 保留后台上传的素材
brader
209 天前
就用你那个临时目录方案就行了,写个定时脚本,定时清理临时目录里超过 24 小时的文件,这样不就不会影响正在进行的业务了
pannanxu
209 天前
设计个附件库模块,有强迫症的用户会自己删除的
dzdh
209 天前
上传独立一个接口,放到附件表,返回文件 id

发布文章、商品,使用 id

使用过的附件,标记已使用

定期清理表里上传多久没有使用的,配合 oss 类的更佳
dzdh
209 天前
以前 discuz 编辑器是 bbcode, 类似是 [attachment]123123[/attachment]
jdkxnktkdkxod
209 天前
存储不值钱
f14g
209 天前
相当于设计一套简单的“gc”系统😁
unco020511
209 天前
两种方案:
1.不用管,现在存储资源费用低,不清理问题不大
2.楼上说了,引用计数,然后定期清理
dallaslu
209 天前
给附件设置一个过期时间
akjarjash
209 天前
是不是搞技术没多久😄
libook
209 天前
一个草案,具体按照你的需求修改。
一个附件表,一个附件引用表。
附件成功上传就记录到附件表,记录路径等信息;帖子或表单每次添加这个附件都在引用表里记录一下,记录是哪个帖子、转帖、引用贴或表单使用了了哪个附件。
定时任务定期对比两个表,找到没有被引用的附件,然后执行删除操作。可以排除最近几个小时上传时间的附件,避免用户正在编辑帖子或表单但还未发布的情况。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/981534

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX