通过delayed_job上传图片到heroku

Upload images to heroku through delayed_job

我正在尝试使用延迟作业将图像从 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)

Heroku dynos 无法访问彼此的本地文件系统。如果我理解正确的话,你有一个网络测功机写入它的本地文件系统(/tmp),然后试图从不同的(工人)测功机读取它。

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

直接上传到 S3 还具有在上传过程中不会占用您的网络测功机以及绕过超时的优点。如果上传直接到 heroku 并且花费的时间比 web dyno 的超时时间长(因为文件很大或者用户的连接速度很慢)那么上传就会失败。

我看到你用 paperclip 标记了这个问题。您可能会发现 this article from Heroku to be useful, though it looks like it is not using the preferred approach of uploading directly to s3. This blog post 有一些使用回形针直接上传到 s3 的示例代码。