2014-12-01 3 views
4

Я пробовал миллион различных учебных пособий в Интернете о том, как загрузить изображение Base64 из приложения iOS в мое приложение rails. Кажется, что независимо от того, как я отформатирую запрос, он просто не будет принят.Как загрузить изображение базы 64 в Rails paperclip

Кто-нибудь знает, как загрузить изображение Base64 в скрепку?

Я попытался отправки параметров, как JSON

{ "thumbnail_image": "base64_data..." } 

Я также попытался добавления URL, данные,

{ "thumbnail_image": "data:image/jpeg;base64,alkwdjlaks..." } 

Я попытался послав объект JSON и без URL данных

{ "thumbnail_image": { "filename": "thumbnail.jpg", "file_data": "base64_data...", "content_type": "image/jpeg" } } 

Я последовательно получаю эти Paperclip::NoHandlerError s, а затем он сбрасывает гигантский кадр данных в мой lo г.

ответ

1

Это, как я делал это в прошлом, и это в основном грубой силы подход, не уверен, если скрепка добавил лучшую поддержку в последних версиях, но это должно работать

class FooBar < ActiveRecord::Base 
    has_attached_file :thumbnail_image 
    validates_attachment_content_type :thumbnail_image, 
            content_type: %w(image/jpeg image/jpg image/png image/gif), 
            message: "is not gif, png, jpg, or jpeg." 

    attr_accessor :base64_thumbnail_image 

    # call this explicitly from the controller or in an after_save callback 
    # after setting the base64_thumbnail_image attribute 
    def save_base64_thumbnail_image 
    if base64_thumbnail_image.present? 
     file_path = "tmp/foo_bar_thumbnail_image_#{self.id}.png" 
     File.open(file_path, 'wb') { |f| f.write(Base64.decode64(base64_thumbnail_image)) } 
     # set the paperclip attribute and let it do its thing 
     self.thumbnail_image = File.new(file_path, 'r') 
    end 
    end 
end 

# params should be base64_thumbnail_image, not thumbnail_image in this case 
+0

Это выглядит многообещающим. Это отстой, что Paperclip в основном игнорирует то, что стало одним из самых распространенных форматов представления изображения :( – OneChillDude

+0

К сожалению, я получил эту ошибку. На самом деле это не вызвало исключение, но изображение не было сохранено 'Content Type Spoof: Filename thumbnail18. png (["image/png"]), тип содержимого, открытый из команды file: text/plain. См. документацию, разрешающую эту комбинацию. ' – OneChillDude

+0

@BrianWheeler - это отдельная проблема - вам нужно добавить' validates_attachment_content_type' в модель для любых типов изображений, которые вы разрешаете - я добавлю в пример кода выше – house9

8

Ваш Base64 строка кажется быть в порядке. Вы всегда можете проверить, что here

Таким образом, проблема, вероятно, на стороне Rails. Убедитесь, что строка, которую вы получаете, точно такая же, как и та, которую вы отправляете.

С Скрепка 4.2.1 мне удалось сохранить Base64 GIF файл таким образом:

Having:

class Thing 
    has_attached_file :image 

и POST атрибуты:

{ 
    "thumbnail_data:" "data:image/gif;base64,iVBORw0KGgo..." 
} 

Все, что вам нужно сделать это найти правильный адаптер и указать original_filename. Таким образом, для контроллера, который будет:

def create 
    image = Paperclip.io_adapters.for(params[:thumbnail_data]) 
    image.original_filename = "something.gif" 
    Thing.create!(image: image) 
    ... 
end 

AFAIK Paperclip упростил сохранение base64 с версии 3.5.0.

Надеюсь, что это поможет!

+0

Действительно, это работает, по крайней мере, в Paperclip 3.5.4. Однако это не работает в версии 3.4.2. – JellicleCat

Смежные вопросы