Curl request to upload image from local machine to ruby on rails application

13,406

Solution 1

you would normally upload a file like this:

curl -i -F [email protected] http://localhost:5000/

doing so mimics the behavior that you would have through a webbrowsers file upload.

if you look at the rails response for this, it's sent via application/octet-stream that can be handled properly as an uploaded file. as far as i know it's not possible to do this with a json request:

Started POST "/" for 127.0.0.1 at 2012-07-10 09:40:59 +0200
Processing by HomeController#index as */*
  Parameters: {"filedata"=>#<ActionDispatch::Http::UploadedFile:0x007f82d59a3580 @original_filename="upload.txt", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"filedata\"; filename=\"upload.txt\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/var/folders/f_/wjnrg7cd3d9f1tpy3k5fhrwm0000gn/T/RackMultipart20120710-30471-1t9abns>>}

Solution 2

I had the same problem and I solved it with the following, which bypass the JSON request:

curl -v -H 'Content-Type: multipart/form-data' -H 'Accept: application/json' -H 'x-api-key:myapikey' -F "user[first_name]=firstname" -F "user[last_name]=lastname" -F "user[display_photo][email protected]" http://localhost:3000/users/8 
Share:
13,406
Mohit Jain
Author by

Mohit Jain

warning ! This is just a rip-off my linkedin profile :D Seasoned Web Developer with over 8 years of work experience, with focus on code quality, scaling, timely delivery, under pressure working experience and performance optimization. My responsibilities in the past ranged from designing and implementing large scalable systems, managing and monitoring clusters of servers, and also mentoring junior engineers and managing project teams. I'm always interested in hands-on contributions to challenging and innovative projects. Good interpersonal skills. Uncompromising work ethic and integrity. Known for quickly ramping up on new code bases and incorporating massive design changes in existing systems. Clean and efficient programming style. Excellent debugging practices, used to work in code written by different people. In the last few years, I wrote tens of thousands of lines of code to scale a system from 1 million users to 20 million users single-handedly. Specialities: Ruby on Rails, Redis, Memcache, MySQL, New Relic, Amazon Web Services, Over night prototyping, Mixpanel

Updated on June 12, 2022

Comments

  • Mohit Jain
    Mohit Jain almost 2 years

    I have an application built in ruby on rails. I need to post curl request to that application to upload images from local machine. In my ruby on rails application I am using paperclip for image uploader.

    Now this curl request is working perfectly fine as there is no upload image for this curl request:

      curl -v -H   "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"user":{"first_name":"John","last_name":"Smith"},"token":"api"}'  http://localhost:3000/users/8
    

    Now I want to upload an image from my localmachine.

    Adding "display_photo":@test.jpg is not working: This is what I was trying: (But its not working.)

      curl -v -H  -F "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"user":{"first_name":"firstname","last_name":"lastname","display_photo":@test.jpg},"token":"api"}'  http://localhost:3000/users/8
    

    So the question is how to upload images/data files/ videos from curl request

    EDIT

    This is my controller:

       def update
        @user = User.find(params[:id])
    
        respond_to do |format|
          if @user.update_attributes(params[:user])
            format.html {  redirect_to(@user, :notice => 'User was successfully updated.') }
            format.json  { render :file => "users/json/show.json.erb", :content_type => 'application/json' }
          else
            format.html { render :action => "edit" }
            format.json  { 
              @errors_object = @user
              render :file => "shared/json/errors.json.erb", :content_type => 'application/json' }
          end
        end
      end
    

    In my model:

    class User < ActiveRecord::Base
        has_attached_file :display_photo, :styles => { :medium => "200x200#", :thumb => "100x100#", :very_small=>"24x24#" }
    end