Загрузка файлов RESTful с помощью CarrierWave

Я пытаюсь создать серверную часть 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 

full

Проблема, по-видимому, связана с процессом преобразования строки, декодированной в формате Base64, в файл. CarrierWave, кажется, ожидает объект File, и вместо этого я даю ему String. Итак, как мне преобразовать эту строку в объект File. Я бы хотел, чтобы это преобразование не сохраняло ничего в файловой системе, просто создайте объект, а CarrierWave сделает все остальное.

6
задан user94154 16 July 2011 в 16:51
поделиться