Rails、Amazon S3 存储、CarrierWave-Direct 和 delayed_job - 对吗?

Rails, Amazon S3 storage, CarrierWave-Direct and delayed_job - is this right?

我刚刚发现 Heroku 没有长期文件存储,所以我需要转而使用 S3 或类似软件。很多新的点点滴滴让我头疼所以我是否了解使用 CarrierWave-direct 直接上传到 S3 然后由 delayed_job 处理应该如何与我的 Rails 应用程序一起工作?

如果我正确编码,我认为应该发生以下情况:

  1. 我注册了一个 S3 帐户,设置了我的存储桶并获取了我需要在其中编程的身份验证详细信息等(对我的用户适当隐藏)
  2. 我确保直接上传白名单不会阻止跨域阻止我的上传(和以后的下载)
  3. 我使用 CarrierWaveCarrierWave-direct(或类似的)来创建我的上传以避免在上传过程中加载我的应用程序
  4. S3 将创建随机访问 ('filename') 信息,因此我无需担心多个用户上传同名文件而文件被覆盖;如果我关心原始名称,我可以使用元数据来存储它们。
  5. CarrierWave-direct 将用户浏览器重定向到 'upload completed' URL 上传后我可以创建 delayed_job 或弹出 'sorry, it went wrong' 通知.
  6. 在这一点上,用户知道该工作将被尝试,他们会继续做其他事情。
  7. 我的 delayed_job 任务使用 S3 API 访问文件,完成后可以删除输入文件。
  8. delayed_job 以通常的方式完成并通知用户,例如一封电子邮件。

是这样还是我遗漏了什么?谢谢。

您对所需的流程有很好的了解。为了给你增加一层复杂性——你应该把它全部包装在 rails new(er) ActiveJob 中。 ActiveJob 只是通过您选择的处理器(在您的情况下为 DelayedJobs)在 rails 内提供后台处理。然后,您可以通过 rails 生成器创建工作:

 bin/rails g job process_this_thing

Active Jobs 提供一些 "rails way" 处理作业...但是,它还允许您更轻松地切换处理器。

因此,您创建了一个载波上传器(请参阅载波文档)。然后,将该上传器附加到模型。对于 carrierwave_direct,您需要取消文件字段与模型表单的关联,并将文件字段移动到它自己的表单(使用 carrierwave-direct 提供的表单 url 方法)。

您可以选择上传文件,然后保存记录。或者,保存记录,然后处理文件。 set-up 过程因您选择的不同而有很大不同。

Carrierwave 和 carrierwave-direct 根据您放入 carrierwave 初始化器中的雾凭据并使用上传器中的 store_dir 路径(如果已设置)知道将文件保存在何处。

Carrierwave 提供定义版本等的上传程序。Carrierwave_direct 设施直接上传到您的 S3 存储桶并在后台处理版本。 Active Jobs,通过DelayedJobs,提供后台处理。雾是载波和 S3 存储桶之间的 link。

您应该向您的模型添加一个布尔标志,当 carrierwave_direct 上传您的图像时设置为 true,然后在作业完成处理版本时设置为 false。这样,您的视图将显示 'this thing is still processing...'.

之类的内容,而不是损坏的 link(虽然工作是 运行 且尚未完成)

RailsCast 是完成此任务的完美资源。看看这个:https://www.youtube.com/watch?v=5MJ55_bu_jM