2011-01-30 11 views
6

私はJavaでバイト配列の形式のイメージを持っています。私は、Ruby on Railsアプリにその画像をアップロードしようとしています。これはPaperclip gemを利用しています。私のRailsのモデルは次のようになります。Ruby on RailsアプリケーションへのHTTP POSTイメージ

class App < ActiveRecord::Base 
    has_attached_file :image 
end 

私はJavaコードを実行すると、私はHHTTP/1.1 302 Found応答私のレールのアプリを取得します。 java HTTP-Postメソッドが更新されました。ここ は、私はHTTPポストのために使用しています新しいJavaコードです:

public void postFile(byte[] image) throws ClientProtocolException, IOException{ 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
    HttpPost httppost = new HttpPost("http://localhost:3000/apps"); 

    ContentBody cb = new ByteArrayBody(image, "image/jpg", "icon.jpg"); 
    //ContentBody cb = new InputStreamBody(new ByteArrayInputStream(image), "image/jpg", "icon.jpg"); 

    MultipartEntity mpentity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
    mpentity.addPart("image", cb); 
    httppost.setEntity(mpentity); 

    HttpResponse response = httpclient.execute(httppost); 
    System.out.println(response.getStatusLine()); 
} 

ここレールコンソール上の新しいデバッグです:ブラウザから直接画像をアップロード

Started POST "/apps" for 127.0.0.1 at Mon Jan 31 00:26:07 +0000 2011 
Processing by AppsController#create as HTML 
Parameters: {"image"=>#<ActionDispatch::Http::UploadedFile:0x1041491c8 @content_type=nil, @original_filename="icon.jpg", @headers="Content-Disposition: form-data; name=\"image\"; filename=\"icon.jpg\"\r\n", @tempfile=#<File:/var/folders/NU/NUcfnxwVHmmnVUo9JUdNok+++TI/-Tmp-/RackMultipart20110131-3735-1ylugl7-0>>} 
SQL (0.1ms) BEGIN 
SQL (1.0ms) describe `apps` 
AREL (0.4ms) INSERT INTO `apps` (`appName`, `image_file_size`, `created_at`, `image_updated_at`, `image_file_name`, `image_content_type`, `updated_at`) VALUES (NULL, NULL, '2011-01-31 00:26:07', NULL, NULL, NULL, '2011-01-31 00:26:07') 
[paperclip] Saving attachments. 
SQL (1.3ms) COMMIT 
Redirected to http://localhost:3000/apps/36 
Completed 302 Found in 18ms 

は魔法のように動作します。私が間違っているつもりです

def create 
    @app = App.new(params[:app]) 

    respond_to do |format| 
    if @app.save 
     format.html { redirect_to(@app, :notice => 'App was successfully created.') } 
     format.xml { render :xml => @app, :status => :created, :location => @app } 
     format.json { render :json => @app, :status => :created, :location => @app }   
    else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @app.errors, :status => :unprocessable_entity } 
     format.json { render :json => @app.errors, :status => :unprocessable_entity }   
    end 
    end 
end 

:ここでは、コントローラ/ apps_controller.rbの実装がですか?

+0

どのようなHTTPライブラリを使用していますか? –

+0

Apache Commons HTTPClient 4.1 – Raunak

+0

ログからエントリがdbと添付ファイルに挿入されているように見えますが、それがそうであるかどうかを確認できますか?また、AppsControllerで作成アクションを確認するのも面白いでしょう。あなたもあなたの質問にそれを含めることができますか? @DanneManne。 – DanneManne

答えて

2

私は問題は、appという名前のパラメータがない場合は画像をparams [:app]で作成することです。何の画像が保存されていない場合

@app = App.new(:image => params[:image]) 

もう一つの良いものは、レコードがデータベースに保存されていないことを確認するためにあなたのアプリケーションモデルで次の検証を追加することができます:私の代わりに動作するはずですあなたのcreateアクションに次を考えます。

validates_attachment_presence :image 
+0

ありがとうDanneManne。 – Raunak

関連する問題