2012-07-09 4 views
5

Ruby on Railsにアプリケーションを構築しました。ローカルマシンから画像をアップロードするには、そのアプリケーションにカール要求を投稿する必要があります。私のRubyアプリケーションでは、私は画像アップローダーのクリップを使用しています。このカールリクエストにはアップロード画像が存在しないとして今、このカール要求が完全に正常に動作しているローカルマシンからRuby上のRubyアプリケーションに画像をアップロードするためのCurlリクエスト

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 

は今、私は私のLOCALMACHINEから画像をアップロードします。 「display_photo」を追加

:test.jpg @が動作していません。これは私がしようとしていたものです:(。しかし、そのはを動作していない)

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 

そこで問題は、画像/データをアップロードする方法ですカールリクエストからファイル/動画

EDIT

これは私のコントローラです:

私のモデルでは
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 

:そう模倣あなたはwebbrowsersファイルのアップロードを通じてだろう行動をしている

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

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

写真をインラインでアップロードしますか? – phoet

+0

@phoetインライン何ですか?あなたのプロフィールを更新するためのリクエスト。ユーザーのプロフィール画像を更新したい –

+0

ええ、ローカルマシンのファイルをjson文字列に変換しようとしています。あなたのカールコマンドを誤解していますか? – phoet

答えて

13

あなたは、通常、このようなファイルをアップロードします。

これについてのレールレスポンスを見ると、アップロードされたファイルとして正しく処理できるapplication/octet-streamで送信されます。私の知る限り、それはJSONリクエストでこれを行うことは可能ではありません知っているように:

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>>} 
+0

私の編集部分を見てください。これが私の要求を受け入れる方法です。コードからapi_tokenチェックを削除しました。 first_name、last_name、および表示イメージのような属性を1回の呼び出しで渡す方法を教えてください。 –

+0

この例を見てくださいhttp://leejava.wordpress.com/2009/07/30/upload-file-from-rest-in-ruy-on-rail-with-json-format/ – phoet

+0

" filedata "部分は、サーバー側で参照するために使用する実際のファイルアップロードの名前です。 – cevaris

6

私は同じ問題を抱えていたと私はJSONリクエストをバイパス後の、とそれを解決:

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 
0
curl -v -include --form "<param>[email protected]/<root>/image_name.png" http://<your url> 
**<param>**: The image parameter of the url; 
**<root>**: You can use pwd get image root; 
**<your url>**: Post url; 
+0

あなたのコードが何をしているのか、なぜそれが問題を解決するのかについての詳しい説明を追加するには、あなたの投稿を編集することを検討してください。ほとんどの場合、コードが含まれていても(たとえそれが機能していても)、OPが問題を理解するのに役立たないのが普通です。 – Drenmi

関連する問題