ruby on rails s3 पर अपलोड करने के लिए कैरियरवेव और rmagick का उपयोग कर exif छवि रोटेशन मुद्दा




ruby-on-rails amazon-s3 (4)

मेरे पास मेरे रेल ऐप में एक फोटो अपलोड सुविधा है। ऐप r3agick और कोहरे के माध्यम से carrierwave के माध्यम से सीधे s3 अपलोड करता है। मेरे पास यह मुद्दा है जब चित्र में "फोटो विकल्प लेना" के माध्यम से मोबाइल के माध्यम से एक फोटो अपलोड किया जाता है (ध्यान दें कि यह आईफोन के साथ है लेकिन मेरा मानना ​​है कि एंड्रॉइड का एक ही मुद्दा है)। एक बार अपलोड होने पर छवि मोबाइल पर ठीक दिखाई देती है, हालांकि डेस्कटॉप पर देखा जाने पर छवि 90 डिग्री घूर्णन दिखाई देती है।

मेरे शोध के माध्यम से यह exif के साथ एक मुद्दा दिखता है। यह stackoverflow उत्तरदाता 2 संभावित समाधान की रूपरेखा। यह gist भी वादा करता है।

अब तक मुझे कुछ समाधान पोस्ट हुए हैं लेकिन किसी ने भी काम नहीं किया है। आदर्श रूप से मैं तस्वीर को चित्र के रूप में एस 3 में सहेजना चाहूंगा, फिर बस छवि को प्रदर्शित करें।

किसी भी सुझाव की सराहना की जाती है।

नीचे मेरा कोड है

एप्लिकेशन / अपलोड करने वाले व्यक्तियों / image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWaveDirect::Uploader

  include CarrierWave::RMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  include CarrierWave::MimeTypes
  process :fix_exif_rotation
  process :set_content_type


  version :thumb do
    process resize_to_fill: [200, 200]
  end

  def extension_white_list
    %w(jpg jpeg png)
  end


  def fix_exif_rotation #this is my attempted solution
    manipulate! do |img|
      img = img.auto_orient!
    end
  end


end

एप्लिकेशन / मॉडल / s3_image.rb

class S3Image < ActiveRecord::Base
  attr_accessible :image, :name, :user_id
  mount_uploader :image, ImageUploader

  belongs_to :user


  def image_name
    File.basename(image.path || image.filename) if image
  end


  class ImageWorker
    include Sidekiq::Worker

    def perform(id, key)
      s3_image = S3Image.find(id)
      s3_image.key = key
      s3_image.remote_image_url = s3_image.image.direct_fog_url(with_path: true)
      s3_image.save!
      s3_image.update_column(:image_processed, true)
    end
  end
end

config / initializers / carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: "AWS",
    aws_access_key_id: " ... ",
    aws_secret_access_key: " ... "
  }
  config.fog_directory = " ... "
end

बीटीडब्ल्यू मैंने अपने एस 3 अपलोड को स्थापित करने के लिए एक गाइड के रूप में इस Railscast उपयोग किया।


मुझे एक ही समस्या थी और इसे आपके दृष्टिकोण के लगभग एक दृष्टिकोण के साथ तय किया गया।

# In the uploader:
def auto_orient
  manipulate! do |img|
    img = img.auto_orient
  end
end

(ध्यान दें कि मैं auto_orient! नहीं कह रहा auto_orient! - बैंग के बिना, केवल auto_orient ।)

तब मेरे पास process :auto_orient मेरे द्वारा बनाए गए किसी भी version की पहली पंक्ति के रूप में process :auto_orient । उदाहरण के लिए:

version :square do
  process :auto_orient
  process :resize_to_fill => [600, 600]
end

खैर मुझे यह बजाय fog या carrierwave_direct का उपयोग करके काम कर रहा है।

नीचे वह कोड है जो मेरे लिए काम कर रहा है:

एप्लिकेशन / अपलोड करने वाले व्यक्तियों / image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
   include CarrierWave::MiniMagick

   include Sprockets::Helpers::RailsHelper
   include Sprockets::Helpers::IsolatedHelper

   storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end


  def fix_exif_rotation #this is my attempted solution
    manipulate! do |img|
      img.tap(&:auto_orient)
    end
  end

  process :fix_exif_rotation
end

एप्लिकेशन / मॉडल / s3_image.rb

class S3Image < ActiveRecord::Base
  attr_accessible :image, :name, :user_id, :image_cache
  mount_uploader :image, ImageUploader

  belongs_to :user
end

initializers / carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: "AWS",
    aws_access_key_id: " ... ",
    aws_secret_access_key: " ... ",
    region: 'us-west-2'
  }
  config.fog_directory = " ... "
end

मेरा समाधान (सुमित के समान ही):

# painting_uploader.rb
process :right_orientation
def right_orientation
  manipulate! do |img|
    img.auto_orient
    img
  end
end

एक छवि वापस करना वास्तव में महत्वपूर्ण है। अन्यथा, आपको एक मिल जाएगा

NoMethodError (undefined method `write' for "":String):

Lando2319 का जवाब मेरे लिए काम नहीं कर रहा था।

मैं RMagick का उपयोग कर रहा हूँ।

मैं इमेजमैजिक को सही अभिविन्यास (और दर्शक द्वारा डबल रोटेशन से बचने के लिए EXIF ​​रोटेशन डेटा को रीसेट करने के लिए) को लागू करने में कामयाब रहा:

def fix_exif_rotation # put this before any other process in the Carrierwave uploader

manipulate! do |img|
  img.tap(&:auto_orient!)
end

मेरे समाधान और लैंडो के बीच का अंतर बैंग (!) है। मेरे मामले में यह बिल्कुल जरूरी था।