I am trying to create an API backend for uploading files. I want to be able to upload files with a POST request that contains a Base64 encoded string. The server must decode the string and save the file using CarrierWave. Here is what I still have:
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/
Rails Console: (Summary)
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
full
The problem seems to be related to the process of converting a string with a Base64 extension to a file. CarrierWave seems to be expecting a File object, and instead I give it a String. So, how do I convert this String to a File object. I would like this conversion to not save anything in the file system, just create an object and let CarrierWave do the rest.
source share