У меня есть принести файл base64 png через параметры. Это base64, потому что он проходит через HTML5 canvas. Атрибут, через который он проходит, является вложенным fields_for. Я не уверен, но это может препятствовать его спасению? хотя сомневаюсь в этом
Я попробовал самый лучший принятый ответ: Загрузка изображений Rails Carrierwave Base64
Это не помогло
В этом посте все по-другомув том, что мой base64 выглядит так: «data: image / png; base64, iVvdvadGAqwete ....»
мой загрузчик:
class PrintFileUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :aws
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
class CarrierStringIO < StringIO
attr_accessor :original_filename
attr_accessor :content_type
end
version :canvas do
process resize_to_fit: [1500, 1500]
end
def content_type_whitelist
/image\//
end
def extension_whitelist
%w(jpg jpeg png)
end
end
Модель:
mount_uploader :print_file, PrintFileUploader
def image_data=(data)
io = CarrierStringIO.new(base64.decode64(data))
# self.mockup_image = io
self.print_file = io
end
Кажется, здесь ничего не происходит. Когда я проверяю запись, print_file
равен nil
Я знаю, что base64 carrierwave gem существует, но это то, что я хотел бы сделать без использования gem.
Как я могу взять свой base64 png, преобразовать его в carrierwave и отправить его в aws через carrierwaave?
Попытки:
def image_data=(data)
data = data[(data.index(',') + 1)..-1]
io = CarrierStringIO.new(base64.decode64(data))
self.print_file = io
end
также попытались добавить data = data[(data.index(',') + 1)..-1]
к content_type,просто чтобы попробовать.
Также попробовал это в моем загрузчике:
before :cache, :convert_base64
class CarrierStringIO < StringIO
def original_filename
# the real name does not matter
"photo.png"
end
def content_type
# this should reflect real content type, but for this example it's ok
"image/png"
end
end
def convert_base64(file)
if file.respond_to?(:original_filename) && file.original_filename.match(/^base64:/)
fname = file.original_filename.gsub(/^base64:/, '')
ctype = file.content_type
decoded = Base64.decode64(file.read)
file.file.tempfile.close!
decoded = CarrierStringIO.new(decoded)
decoded.original_filename = fname
decoded.content_type = ctype
file.__send__ :file=, decoded
end
file
end
Нашел ^ это из других принятых ответов, но ни один из них, кажется, не работает.
Просто вдело имеет значение, мой base64 png исходит из javascript с холста следующим образом:
var url = canvas.toDataURL('image/png')
$("#canvascontent").val(url);
с < ... id="canvascontent" >
скрытым полем в форме.