通过delayed_job将图像上传到heroku

时间:2015-07-15 10:27:36

标签: ruby-on-rails heroku amazon-s3 paperclip

我正在尝试使用延迟作业将图像上传到Heroku的s3存储桶。

但似乎heroku延迟工作无法获得tmp图像路径。 请让我知道我做错了什么或更好的方法。

这是我的控制器代码:

  if @post.save
    unless @post.post_type == 0
      image_a = image_b = ''
      if item_image_params['0'][:item_type] == "A"
        image_a = item_image_params['0'][:image]
        image_b = item_image_params['1'][:image]
      else
        image_a = item_image_params['1'][:image]
        image_b = item_image_params['0'][:image]
      end
      @post.delay.save_image(image_a.path, image_b.path)
    end
  end

我的型号代码:

  def save_image(image_a, image_b)
    items.each do |item|
      if item.item_type == "A"
        item.build_item_image.image = File.open(image_a)
      else
        item.build_item_image.image = File.open(image_b)
      end
    end
    if self.save
      File.delete(image_a) if File.exist?(image_a)
      File.delete(image_b) if File.exist?(image_b)
    end
  end

我在延迟时收到此错误:

:save_image args: - /tmp/RackMultipart20150715-3-1qoy83r.jpeg - /tmp/RackMultipart20150715-3-if712h.jpeg 
 last_error:
  "No such file or directory - /tmp/RackMultipart20150715-3-if712h.jpeg\n/app/app/models/post.rb:35:in

第35行,代码为:

 item.build_item_image.image = File.open(image_b)

1 个答案:

答案 0 :(得分:2)

Heroku dynos无法访问彼此的本地文件系统。如果我理解正确,你有一个web dyno写入其本地文件系统(/ tmp),然后尝试从另一个(工作人员)dyno读取它。

将上传直接转到S3会好得多。我已经使用carrierwave_direct取得了很好的成功,或者您可以使用其他内容或自己动手。

直接上传到S3还具有以下优势:在上传过程中不会占用您的网络动态并绕过超时。如果上传直接进入heroku并且花费的时间比网络动态超时(因为文件很大或用户连接速度慢),那么上传将会失败。

我发现您已使用paperclip标记了此问题。您可能会发现Heroku中的this article有用,虽然看起来它没有使用直接上传到s3的首选方法。 This blog post有一些示例代码,可以使用回形针直接上传到s3。