Ich habe eine Foto-Upload-Funktion in meiner Rails App. Die App lädt direkt über smar3 und carrierwave über smarag und dog auf s3 hoch. Das Problem, das ich habe, ist, wenn ein Foto per Handy über die Option "Foto aufnehmen" im Hochformat hochgeladen wird (beachten Sie, dass dies mit dem iPhone ist, aber ich glaube, Android hat das gleiche Problem). Nach dem Hochladen erscheint das Bild auf Mobilgeräten einwandfrei, wenn es jedoch auf dem Desktop angezeigt wird, erscheint das Bild um 90 Grad gedreht.Exif Bilddrehung Problem mit Carrierwave und rmagick zum Hochladen auf s3
Durch meine Forschung scheint es ein Problem mit Exif. Diese stackoverflow responder skizziert 2 mögliche Lösungen. Diese gist sieht auch vielversprechend aus.
Bis jetzt habe ich ein paar Lösungen gefunden, aber keine haben funktioniert. Idealerweise möchte ich, dass das Foto als Porträt auf s3 gespeichert wird, und dann das Bild einfach so anzeigen, wie es ist.
Alle Vorschläge werden sehr geschätzt.
Unten ist mein Code
app/uploaders/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
app/models/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
BTW ich verwendet diese Railscast als Leitfaden für die Einrichtung meiner s3-Upload.
Warum der 'tap'?() –
Ich bin mir nicht sicher ... – lando2319
@ JonathanAllard der 'manipulate!' Block will ein Bild, aber 'image.auto_orient' gibt einen leeren String zurück. 'image.tap (&: auto_orient)' entspricht ungefähr image.auto_orient; Bild'. – benizi