我有一个照片共享应用程序,允许用户拖放图像,然后在延迟作业中处理这些图像并显示在画廊中。我在解决iPhone 图片上的方向问题时遇到了一些问题。我有以下代码:
初始化程序/auto_orient.rb
module Paperclip
class AutoOrient < Paperclip::Processor
def initialize(file, options = {}, *args)
@file = file
end
def make( *args )
dst = Tempfile.new([@basename, @format].compact.join("."))
dst.binmode
Paperclip.run('convert',"#{File.expand_path(@file.path)} -auto-orient #{File.expand_path(dst.path)}")
return dst
end
end
end
模型/图片.rb
class Picture < ActiveRecord::Base
belongs_to :gallery
before_create :generate_slug
after_create :send_to_delayed_job
validates :slug, :uniqueness => true
scope :processing, where(:processing => true)
attr_accessible :image
has_attached_file :image,
:styles => {
:huge => "2048x1536>",
:small => "800x600>",
:thumb => "320x240>"
},
:processors => [:auto_orient, :thumbnail]
before_post_process :continue_processing
...
def process
self.image.reprocess!
self.processing = false
self.save(:validations => false)
end
private
def continue_processing
if self.new_record?
!self.processing
end
end
def send_to_delayed_job
Delayed::Job.enqueue ImageProcess.new(self.id), :queue => 'paperclip'
end
end
模型/image_process.rb
class ImageProcess < Struct.new(:picture_id)
def perform
picture = Picture.find(self.picture_id)
picture.process
end
end
如果我注释掉这些行after_create :send_to_delayed_job
,before_post_process
即当场完成处理,则自动定位过程有效。但是,当我完成延迟工作时,不会发生自动定位,只是调整大小。
有没有人有任何想法?
编辑
它变得陌生。我搬到了 Carrierwave 和carrierwave_backgrounder gem。现在忽略后台任务,我的内容如下image_uploader.rb
:
def auto_orient
manipulate! do |img|
img.auto_orient!
img
end
end
version :huge do
process :auto_orient
process resize_to_fit: [2048,1536]
end
这行得通。图像方向正确。
现在,如果我按照载波 wave_backgrounder 的说明添加process_in_background :image
到我的picture.rb
文件中,auto_orient 将不起作用。
我现在要试试这个store_in_background
方法,看看是否有什么不同。