2014-05-15 15 views
10

Mam model Zdjęcie z atrybutem obrazu. Obraz zawiera ciąg base64 uzyskany z api. Muszę uruchomić wywołanie zwrotne after_create i myślałem, że mogę użyć Paperclip do zapisania obrazu na dysku w wywołaniu zwrotnym, ponieważ zaoszczędziłoby to trochę pracy wykonującej strukturę folderów w folderze publicznym i generując miniatury. Czy istnieje prosty sposób na zrobienie tego?Użyj spinacza do zapisywania obrazów base64 uzyskanych z api

Odpowiedz

16

Aby odpowiedzieć na moje własne pytanie, o to co mam wymyślić:

class Photo < ActiveRecord::Base 

    before_validation :set_image 

    has_attached_file :image, styles: { thumb: "x100>" } 
    validates_attachment :image, presence: true, content_type: { content_type: ["image/jpeg", "image/jpg"] }, size: { in: 0..10.megabytes } 

    def set_image 
    StringIO.open(Base64.decode64(image_json)) do |data| 
     data.class.class_eval { attr_accessor :original_filename, :content_type } 
     data.original_filename = "file.jpg" 
     data.content_type = "image/jpeg" 
     self.image = data 
    end 
    end 

end 

image_json jest pole tekstowe zawierające rzeczywiste base64 zakodowany obraz (tylko część danych, na przykład „/ 9j/4AAQSkZJRg ... ")

+0

Cześć, z punktu widzenia przekazałeś zakodowany ciąg jako ukryte pole do kontrolera? a od kontrolera co zrobiłeś? –

+0

nic specjalnego, po prostu coś takiego jak Photo.create! (Image_json: i) gdzie i jest danymi z skrótu params zawierającego ciąg base64 – maprihoda

+0

To jest świetne, dzięki! – ipd

5

Twój set_image powinien wyglądać mniej więcej tak

0
require 'RMagick' 
data = params[:image_text]# code like this data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABPUAAAI9CAYAAABSTE0XAAAgAElEQVR4Xuy9SXPjytKm6ZwnUbNyHs7Jc7/VV9bW1WXWi9q 
image_data = Base64.decode64(data['data:image/png;base64,'.length .. -1]) 
new_file=File.new("somefilename.png", 'wb') 
new_file.write(image_data) 

Po kan użytkowania i Mag jako plik Photo.new (image: image) #save useng spinacza w modelu Photo

1

Przynajmniej ze spinacza 5 działa po wyjęciu z pudełka należy podać w formacie base64 ciąg data:image/jpeg;base64,#{base64_encoded_file}

dla ciebie modelu będzie

Photo.new(
    image: "data:image/jpeg;base64,#{image_json}", 
    image_file_name: 'file.jpg' # this way you can provide file_name 
) 

Dodatkowo w kontrolerze nie trzeba nic zmieniać :-) (może chcesz przyjąć :image_file_name w params)

+0

Typy zawartości z kropkami wewnątrz zostały naprawione wokół wersji 4.2, wcześniejsze wersje obsługują także adapter base64, ale tylko dla łatwych typów zawartości (poprawka to zastąpienie regex) – Vasfed

0

Od Paperclip 5.2 musisz zarejestrować DataUriAdapter dla Paperclip, aby obsługiwał obrazy base64.

W config/inicjalizatorów/spinacza umieścić: Paperclip::DataUriAdapter.register

Następnie jako @eldi mówi, że może po prostu zrobić:

Photo.new(
    image: "data:image/jpeg;base64,#{image_json}", 
    image_file_name: 'file.jpg' # this way you can provide file_name 
) 

(Zobacz Spinacz uwolnienie zauważa here)