I want to share a quick snippet with regards to a problem I had a few months ago: How to upload a picture/file to a Ruby on Rails project, which is utilizing CarrierWave to handle the upload mechanism, by utilizing the direct POST call.
With this comes at least two challenges:
- You cannot insert a file directly into a JSON object;
- CarrierWave does not support uploading a file which is not uploaded using a form object.
Solving the first problem is almost trivial, you simply encode the file into Base64 and pass it along, but the second problem requires a little more work. What I did to solve it was to decode the Base64 string into a temp file, and then create a new uploaded file from that temp file.
# POST /pictures # POST /pictures.json def create #check if file is within picture_path if params[:picture][:picture_path]["file"] picture_path_params = params[:picture][:picture_path] #create a new tempfile named fileupload tempfile = Tempfile.new("fileupload") tempfile.binmode #get the file and decode it with base64 then write it to the tempfile tempfile.write(Base64.decode64(picture_path_params["file"])) #create a new uploaded file uploaded_file = ActionDispatch::Http::UploadedFile.new(:tempfile => tempfile, :filename => picture_path_params["filename"], :original_filename => picture_path_params["original_filename"]) #replace picture_path with the new uploaded file params[:picture][:picture_path] = uploaded_file end @picture = Picture.new(params[:picture]) respond_to do |format| if @picture.save format.html { redirect_to @picture, notice: 'Picture was successfully created.' } format.json { render json: @picture, status: :created, location: @picture } else format.html { render action: "new" } format.json { render json: @picture.errors, status: :unprocessable_entity } end end end
The code above is fairly self explanatory, so I wont bother to go through it again, but it is critical to know what the structure of my json call looked like:
picture {:user_id => "1", :folder_id => 1, etc., :picture_path {:file => "base64 awesomeness", :original_filename => "my file name", :filename => "my file name"}}
Finally, you will need to delete the temp file in some way, but I’ll leave that up to you.
Happy coding!
No comments:
Post a Comment