4

我在 Heroku 上有一个带有 Carrierwave 的应用程序。在一个页面上,我有 2 个表单:1 个用于上传图片的 ajax 表单和 1 个用于创建对象所需的附加信息的普通表单。假设我的 Carrierwave 挂载为:picture,每次提交 ajax 表单时,图片都会临时保存到 public 文件夹中,其路径返回为:picture_cache. 第二种形式然后使用它来知道在第二个请求中要使用新对象创建哪个图片。这适用于单个测功机。

不同的测功机不知道彼此的文件系统。因此,如果提交第二个表单的请求与第一个表单的请求不同,它就找不到图像。

有没有人解决过这个问题?

4

1 回答 1

2

我使用自定义模型并将所有文件(包括 tmp 文件)存储在 mongodb 中。上传被标记为 tmp。那些模型是“保存”的,我只需删除“tmp”标志。这样,所有节点始终可以看到所有图像。载波默认缓存在 ./tmp 中是非常疯狂的,因为许多多节点配置会看到这个问题(除非平衡器实现会话亲和性)。

这是我的模型和控制器等:https ://gist.github.com/3161569

您必须以下列形式进行一些自定义工作:

  • 保存每个发布的文件,无论如何
  • 在隐藏字段中中继发布的文件 ID
  • 在保存时查找文件和/或以前上传的 id
  • 建立模型关联

这种方法虽然不是“魔术”,但也产生了以下令人敬畏的副作用:

  • 你有一个进程在后台运行作业来缩略图图像与旋转 image_magick 每当用户点击“提交”(这是一个严重的DOS 向量,尤其是在内存有限的主机上,如 heroku)

  • 您可以在后台、每小时或其他任何情况下将图像迁移到 s3,并且上传只是有一个新的 url(在这种情况下,如果控制器注意到这一点,则需要发出永久重定向)。这真的很好,因为您可以将它们保存在数据库中以进行开发、登台等,并在不更改任何上传或查看代码的情况下将部分或全部上传迁移到 s3。

于 2012-07-23T01:24:32.063 回答