angus
(Angus McLeod)
1
在某些情况下,人们希望 Discourse 中保留一些上传文件,这些文件并不严格关联于现有的 Discourse 模型或支持上传的属性,即“白名单”孤儿上传。例如,有些人希望使用 Custom Wizard 插件上传与主题(而非帖子本身)相关的内容。
问题在于,clean_up_uploads 作业会删除所有孤儿上传。其例外情况仅限于特定站点设置中的 URL。
当然,您可以关闭 clean_up_uploads,或者延长 clean_orphan_uploads_grace_period_hours,这也是我有时不得不采取的做法。但这并不是最理想的方案。
也许还有其他方法可以从插件层面“白名单”化孤儿上传,只是我尚未发现。如果没有,那么最好在上传清理流程中添加相应的机制。
我很乐意为此准备一个 PR,但我想确认一下,其他人是否也认为这是一个问题。
sam
(Sam Saffron)
2
这太笨拙了
关于可审查项(reviewables),@eviltrout 引入了一种通用机制,允许将任意对象关联到可审查项。
将上传功能迁移到类似的系统,无异于移走多座大山。不过,这确实是一座值得移走的大山,因为当前的系统相当脆弱。
目前最简单的变通方法是:创建一个隐藏的网站设置,其 data_type 为 :upload,然后将其添加到网站设置表中。
angus
(Angus McLeod)
3
是的,我也这么想过。但我不太喜欢这个方案,因为我需要为每个上传创建不同的设置,这感觉像是在滥用 site_settings 表。
在问题彻底解决之前,作为一个临时方案,您是否介意我提交一个 PR,为那个使用 plugin_store_row 且 plugin_name 类似 whitelisted_orphan_upload_id 的大型“异常”查询添加一个额外的例外?
sam
(Sam Saffron)
4
这个查询已经非常非常慢了,我担心在这里再增加一个 JOIN 会让性能变得极其糟糕。
我不太确定,但也许我们可以先在核心库中准备一个新表 UploadReference(object_id, object_type, upload_id),然后先关联到这个表,这样成本较低,之后再把数据迁移过去。有不少迁移工作很简单,只有帖子上传的迁移会比较棘手……
我觉得这项工作最好由我们团队来接手,因为它非常琐碎。
很好奇 @zogstrip 和 @eviltrout 怎么看。
eviltrout
(Robin Ward)
5
你是在说 Rails 的 单表继承 吗?这对可审核项来说非常合适,因为它们共享一些核心逻辑,但又需要额外的字段。
不过在这种情况下,问题似乎是我们到处都在使用上传 ID,并且在清理这些记录时并没有删除对应的上传文件?
如果用户从个人资料中移除上传文件就删除该上传是否不安全?因为相同的上传 SHA1 可能在应用的其他地方被使用?如果是这样,我认为 @sam 提出的创建 UploadReference 表的建议是个不错的解决方案。
如果上传文件不会以这种方式被共享,那么更好的解决方案应该是在这些字段被设为 NULL 时直接删除对应的上传文件。
这正是我们需要 UploadReference 表的原因 
我其实认为这是一个非常好的任务,可以借此更深入地了解 Discourse 的内部机制。这可能是给 @cvx 安排的一个好任务,从 10 月初开始。我们将通过结对编程来启动工作,并将其正确地拆分为多个“小”任务。
你好!
我对 UploadReference 表非常感兴趣。我们目前面临的情况是,插件中存在大量被视为孤立的上传文件。我们的解决方案是简单地关闭 clean_up_uploads。前几天我检查时发现,现在有 10GB 的孤立上传文件,需要手动通过脚本来清理,该脚本还需判断这些文件是否在插件中被引用。像这里讨论的解决方案将对我们有很大帮助。
David
另外,关于这个话题。在某些情况下,我们仅使用 HTML img 标签来引用一些上传内容。这似乎会中断这些帖子的渲染,导致超链接等其他元素无法正常生成。我注意到,上传内容通常以 upload://.png 的形式被引用。我的问题是,这个 字符串在哪里可以找到?从我目前看到的,它并没有存储在上传记录中。
这被称为 short url,你可以在 Upload 模型中找到它的计算方式
哦,谢谢!我想我看得不够仔细:slight_smile:
fzngagan
(Faizaan Gagan)
12
@angus
我们最近合并了此 PR,它添加了一个 upload_references 表来解决 OP 中提出的问题。
angus
(Angus McLeod)
13
Custom Wizard 插件已实现此功能。感谢您添加此系统!