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

2023-10-13 09:34:18 +08:00
 abcbuzhiming
比如以论坛的发帖功能来讲,它有个上传附件功能,我上传了一个附件,但是我突然把这个页面关了,没点保存,于是这个上传的附件就是个废附件,实际没用,占空间。

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

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

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

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

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

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

发布文章、商品,使用 id

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

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

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

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

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

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

© 2021 V2EX