Я пытаюсь создать серверную часть API для загрузки файлов. Я хочу иметь возможность загружать файлы с помощью запроса POST, который содержит строку файла в кодировке Base64. Сервер должен декодировать строку и сохранить файл с помощью CarrierWave. Вот что у меня есть:
photo.rb:
class Photo
include Mongoid::Document
include Mongoid::Timestamps
mount_uploader :image_file, ImageUploader
end
image_uploader.rb:
class ImageUploader < CarrierWave::Uploader::Base
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
end
Консоль Rails: (сводка)
ruby-1.8.7-p334 :001 > img = File.open("../image.png") {|i| i.read}
=> "\377���JFIF\000\001\002\001\000H\000H\000\000\377�Photoshop 3.0\0008BIM\003...
ruby-1.8.7-p334 :003 > encoded_img = Base64.encode64 img
=> 3af8A\nmLpplt5U8q+a7G2...
ruby-1.8.7-p334 :005 > p = Photo.new
=> #
ruby-1.8.7-p334 :006 > p.user_id = 1
=> 1
ruby-1.8.7-p334 :007 > p.image_file = Base64.decode64 encoded_img
\255��=\254\200�7u\226���\230�-zh�wT\253%����\036ʉs\232Is�M\215��˿6\247\256\177...
ruby-1.8.7-p334 :008 > p.save
=> true
ruby-1.8.7-p334 :009 > p.image_file.url
=> nil
Проблема, по-видимому, связана с процессом преобразования строки, декодированной в формате Base64, в файл. CarrierWave, кажется, ожидает объект File, и вместо этого я даю ему String. Итак, как мне преобразовать эту строку в объект File. Я бы хотел, чтобы это преобразование не сохраняло ничего в файловой системе, просто создайте объект, а CarrierWave сделает все остальное.