Heroku上的Rails + Paperclip非常慢

时间:2013-07-21 07:21:34

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

我正在使用Heroku + Amazon S3 + Paperclip gem组合来上传文件。它工作正常,但上传本身非常慢。

我试图买一个额外的dyno并稍微更新了模型:

class Image < ActiveRecord::Base

  belongs_to :imageable, :polymorphic => true
  belongs_to :user
  belongs_to :album

  attr_accessible :caption, :title, :image, :image_file_name, :user_id, :album_id


  has_attached_file :image,
                    :styles => { :tiny => '100x100>', 
                                 :original => "900x900>" },
                    :path => ":rails_root/public/images/:user_id/:style/:basename.:extension",
                    :url  => ":s3_eu_url"

  process_in_background :image
end

这在Heroku上工作得非常快,但是:我选择要上传的文件,点击按钮上传,几秒钟内刷新页面。我没有看到上传的图片本身,因为尚未上传。但是后台进程会上传它。 当我像2-4秒后刷新页面时,我正确地看到上传的图像。

但这不是用户友好的方式。 如何使用Paperclip和延迟作业快速将图像上传到Heroku?我错过了什么来正确设置它?

由于

4 个答案:

答案 0 :(得分:0)

尝试一个名为CarrierWaveDirect的新Gem,它允许您使用html表单将文件直接上传到S3,并轻松将图像处理移动到后台进程

答案 1 :(得分:0)

从用户的角度来看,你永远无法避免从个人电脑上传到完成处理(和/或复制到s3)所需的时间

您可以做的最好的事情是改善您的用户体验,但要么显示文件尚未完成处理的消息,要求用户返回并稍后再试。

也就是说,您可以直接上传到s3(但没有回形针,因为这是您的处理器,并且您需要在heroku服务器(或任何其他服务器)上进行imagemagick处理您的样式。

请参阅此How do I upload direct to S3 with Paperclip has_attached_file connected to a model?

http://aws.amazon.com/articles/1434?_encoding=UTF8&jiveRedirect=1

当向用户发送一条消息来解决原始问题(这是为了提高用户友好性)时,自己处理所有这些可能会非常痛苦。

答案 2 :(得分:0)

1)如果您的应用程序可以使用,您可以将s3存储桶位置更改为US East作为其他解决方案。它不会完全解决问题,但会提高上传速度。

2)您可以使用s3_direct_upload直接上传到s3。 http://blog.littleblimp.com/post/53942611764/direct-uploads-to-s3-with-rails-paperclip-and

答案 3 :(得分:0)

最近我更喜欢及时进行图像处理。太多次我使用paperclip只是为了在重新设计过程中改变前端要求,迫使我在批处理作业中重新处理所有UG图像。

我创建了一个适合与rails一起使用的简单gem,让您代理用户上传的图像并通过更改url参数按需处理它们:https://github.com/jcihocki/uncut

它接受您在paperclip中的:styles hash中提供的相同类型的几何字符串。它相对较新,但也很简单,我在生产中使用它。贡献也欢迎。

用法:

<%= $your_cdn_base_uri + processed_image_uri_for( "http://mybucket.s3.amazonaws.com/path/to/img.jpg", '100x100>' ) %>