Я пытаюсь создать 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
=> #<Photo _id: 4e21b9a31d41c817b9000001, created_at: nil, updated_at: nil, _type: nil, user_id: nil, image_file_filename: nil>
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 делать все остальное.