Ruby on Rails:基于会话的临时文件?会议?

时间:2014-01-15 00:22:42

标签: ruby-on-rails session temporary-files

在我的项目中,我已经上传,验证了文件,然后根据文件内容要求用户提供更多输入。问题是用户可以注销,丢失互联网连接,被总线击中,无论如何......最终孤立的文件停留在服务器上。文件并不是那么令人担心,但是在tmp /目录中有一个很大的混乱并没有激发我的灵感,这会带来潜在的安全风险(即用户进行了十亿次上传并完全耗尽了应用程序可用的空间)。

我目前的解决方案是基于ActiveRecord :: SessionStore的会话存储的自己实现:ActiveRecord后代用after_destroy钩子删除孤立文件,在这里添加一个清除超时会话的sidetiq工作者,它将正常工作。

但这种情况有一个很大的缺陷:“记住我”会使会话永久化。因此会话永远不会被销毁(直到用户手动注销)并且文件不会被删除。

我的问题是: 1.有没有更好的方法来管理上传的临时文件,但应该在处理/用户注销/一些超时/ ...后删除? 2.有宝石帮助吗?我有我的解决方案,但我不确定它是否正确实施。

1 个答案:

答案 0 :(得分:1)

如果您可以定义这些临时文件的时间限制,我建议您使用类似Whenever gem的内容来每天/每小时扫描一定年龄的文件并删除它们。如果不知道你正在做什么,那么你可以安全地删除超过几天的临时文件似乎是一个很好的假设。

您可以定义一种方法来删除基于年龄的临时文件,如果您的应用程序中存在这样的概念,则可以在类级别删除临时文件,或者甚至可以在用户模型中(或更合适的方式)。然后,使用Whenever,例如:

来调用它
every 12.hours do
  runner "User.sweep_temp_files"       
end

由于您还希望在用户注销时显式删除临时文件,因此您可以定义此扫描方法以接受年龄参数,或沿着这些行的某些内容。