2011-01-30 10 views
6

Tôi có một hình ảnh dưới dạng một mảng byte trong java. Tôi đang cố tải hình ảnh đó lên ứng dụng Ruby on Rails, sử dụng đá quý Paperclip. Mô hình Rails của tôi trông giống như sau:HTTP-POST một hình ảnh tới ứng dụng Ruby on Rails

class App < ActiveRecord::Base 
    has_attached_file :image 
end 

Khi tôi thực thi mã java, tôi nhận được HHTTP/1.1 302 Found trả lời ứng dụng đường ray của tôi. Cập nhật phương thức HTTP-Post java. Dưới đây là đoạn code java mới mà tôi đang sử dụng cho HTTP-Post:

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()); 
} 

Đây là debug mới trên đường ray console:

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 

Đang tải lên hình ảnh trực tiếp từ trình duyệt hoạt động giống như một nét duyên dáng. Dưới đây là việc triển khai bộ điều khiển/apps_controller.rb:

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 

Tôi sẽ làm gì sai?

+0

Bạn đang sử dụng thư viện HTTP nào? –

+0

Apache Commons HTTPClient 4.1 – Raunak

+0

Từ nhật ký có vẻ như một mục nhập đang được chèn vào db và tệp đính kèm đang được lưu, bạn có thể xác nhận xem đó có phải là trường hợp hay không? Và cũng sẽ rất thú vị khi thấy hành động tạo trong AppsController, bạn có thể đưa nó vào câu hỏi của mình không? – DanneManne

Trả lời

2

Tôi nghĩ rằng vấn đề là bạn cố gắng tạo ra các ứng dụng với params [: app] khi không có tham số được đặt tên ứng dụng, chỉ có hình ảnh. Tôi nghĩ rằng sau trong tạo hành động của bạn sẽ làm việc thay vì:

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

Một điều tốt có thể để thêm xác nhận sau đây trong mô hình ứng dụng của bạn để đảm bảo rằng một kỷ lục không được lưu vào cơ sở dữ liệu nếu không có hình ảnh đã được cứu .

validates_attachment_presence :image 
+0

Cảm ơn DanneManne. – Raunak