【问题标题】:Rails, Amazon S3 storage, CarrierWave-Direct and delayed_job - is this right?Rails、Amazon S3 存储、CarrierWave-Direct 和delayed_job - 对吗?
【发布时间】:2017-03-27 03:33:11
【问题描述】:

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

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

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

是这样还是我错过了什么?谢谢。

【问题讨论】:

    标签: ruby-on-rails amazon-s3 carrierwave delayed-job


    【解决方案1】:

    您对所需的流程有很好的了解。为了给您增加一层复杂性——您应该将所有这些都包装在 rails new(er) ActiveJob 中。 ActiveJob 通过您选择的处理器(在您的情况下为 DelayedJobs)简单地在 Rails 内进行后台处理。然后,您可以通过 rails 生成器创建作业:

     bin/rails g job process_this_thing
    

    Active Jobs 提供了一些处理作业的“rails 方式”......但是,它还允许您更轻松地切换处理器。

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

    您可以选择上传文件,然后保存记录。或者,保存记录,然后处理文件。根据您的选择,设置过程会有很大不同。

    Carrierwave 和carrierwave-direct 根据您在carrierwave 初始化程序中放置的雾凭证以及使用上传器中的store_dir 路径(如果已设置)来了解文件的保存位置。

    Carrierwave 提供了上传器,它定义了版本等。 Carrierwave_direct 工具直接上传到您的 S3 存储桶并在后台处理版本。 Active Jobs 通过 DelayedJobs 提供后台处理。雾是carrierwave 和您的S3 存储桶之间的链接。

    您应该在您的模型中添加一个布尔标志,当 carrierwave_direct 上传您的图像时设置为 true,然后在作业完成处理版本时设置为 false。这样,您的视图将显示类似“这件事仍在处理中...”之类的内容,而不是断开的链接(当作业正在运行但尚未完成时)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 2012-03-21
      • 2016-03-31
      • 1970-01-01
      • 2011-11-10
      相关资源
      最近更新 更多