2013-04-23 1 views
0

Это то, что я делаю:base64 Изображение загружено с StringIO carrierwave драгоценный камень становится коррумпированной при загрузке в рельсах

В контроллере: -

dataurl = params[:dataURL] 
    io = FilelessIO.new(Base64.decode64(dataurl)) 
    io.original_filename = "foobar.jpeg" 
    io.content_type = "image/jpeg" 
    p = SketchilyTest.new 
    p.image = io 
    p.save  

Модель: -

class FilelessIO < StringIO 
    attr_accessor :original_filename 
    attr_accessor :content_type 
end 
class SketchilyTest < ActiveRecord::Base 
    attr_accessible :desc, :image 
    mount_uploader :image, BaseSixtyfourEncodedUploader 

end 

BaseSixtyfourEncodedUploader является простым загрузчиком драгоценного камня несущей.

Проблема в том, что я не получаю никаких ошибок d изображение загружается, но его повреждает.

Когда я пытаюсь открыть его в браузере я получаю эту ошибку:

The image “http://localhost:3000/uploads/sketchily_test/image/41/foobar.jpeg” cannot be displayed because it contains errors. 

Также обратите внимание, что я в состоянии регенерировать изображение из моих base64_encoded данных из моей базы данных. Но не удалось сохранить его как jpeg-изображение с несущей.

+0

что ваши PARAMS [: dataurl]? представление изображения - это данные: image/jpeg; base64,/9jblablablabla ....., is '/ 9jblablablabla .....', возможно, вы также фиксируете передние данные, поэтому он содержит ошибки – Nich

+0

@ Нич, да в этом формате данные: image/jpeg; base64,/9j, я просто попытался сохранить dataurl. Нет необходимости в изображении, полученном в коде для сохранения изображения. –

+0

Хмм, я имею в виду, что вы декодируете данные: image/jpeg; base64,/9jblablablabla или/9jblablablabla, неправильное декодирование может привести к повреждению изображения, я предлагаю вам попробовать декодировать URL-адрес и сделать это в консоли rails и сохранить его в File.new – Nich

ответ

2

Представление изображения:

data:image/jpeg;base64,/9jblablablabla 

Используйте регулярное_выражения, чтобы получить значение data:image/jpeg и /9jblablablabla

image/jpeg будут вашего типа файла

/9jblablablabla будет представления изображения.

Ошибка декодирования неправильного источника может привести к повреждению файла изображения. Затем вы можете использовать FileTemp для создания и сохранения файла. Надеюсь, его помощь и другие тоже ..

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html