【问题标题】:How to link a temporary file with the users session in Rails?如何将临时文件与 Rails 中的用户会话链接?
【发布时间】:2014-08-19 22:03:29
【问题描述】:

Ruby on Rails 指南中有如下内容:

不要在会话中存储大型对象。相反,您应该将它们存储在数据库中并将它们的 id 保存在会话中。 [..] – http://guides.rubyonrails.org/security.html#session-guidelines

我想将临时文件(例如文本文件和 1.2M JPEG 图片)与Ruby on Rails 4.1 中的用户会话连接起来。数据库是没有选择的。我不想将文件保存在 blob 中,也不想保留记录以获得ID,因为它是一个临时文件。我想要一个干净的系统,所以临时文件应该在它们过期后被清理。类似于PHP的会话管理。

Rails 提供的其他会话存储类型似乎也不适合此。

那里已经有宝石,我可以使用吗? 有没有我看不到的Rails 路径来做类似的事情?对于Rails,这种行为是否因某些原因不寻常?

Tl;博士

我最近才意识到PHP 存储会话内容的方式与Ruby on Rails 存储会话内容的方式之间的区别。 PHP 仅在客户端存储会话 ID - 内容存储在服务器上的文件中,而 Rails 及其 CookieStore 将所有内容保存在客户端。 PHP 的临时文件从PHP 5.3 开始被垃圾收集器清理,它是 cron 任务。

【问题讨论】:

  • 只需将文件名存储在会话中的某处。只是不要忘记在会话被终止/过期时删除该文件名,否则您将拥有无数孤立的临时文件。 PHP 会清理会话文件,但不会清理您附加到该会话的任何文件——这不是 PHP 的工作。
  • 你到底在存储什么?
  • @dax:临时文件 - 例如 1.2M 大小的 JPEG 图片。

标签: php ruby-on-rails ruby session ruby-on-rails-4


【解决方案1】:

使用 memcache 或类似的东西。创建一个令牌并将其存储在会话中,然后使用它来访问缓存。

对于 PNG 图像:

# controller
session[:tmp_token] = SecureRandom.hex(12)
Rails.cache.put(session[:tmp_token], binary_png_data_converted_to_base_64)

显示base64编码的png

<img src="data:image/png;base64, <%= Rails.cache.fetch(session[:tmp_token]}%>" />

【讨论】:

  • 感谢您的回答。也许我可以使用会话 ID 作为令牌,所以我不需要更新我的 cookie?
  • 您可以使用会话 ID,向 cookie 添加另一个随机十六进制值不会造成任何伤害。
  • 我更多地考虑当我通过 AJAX 上传文件时,会话没有得到更新。
  • 渲染一个 js.erb 视图作为 AJAX 请求的响应,这会将您想要的图像/html 插入到 HTML 中。
  • 我不确定是否应该在 Rails 已经用于缓存的缓存之外定义另一个缓存。你有什么建议?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2023-03-15
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多