2012-07-12 36 views
6

Tôi đang cố tải hình ảnh lên máy chủ đường ray của mình từ Android. Tất cả các dữ liệu tải lên khác của tôi, nhưng tôi gặp lỗi "Lỗi kích thước cơ thể không hợp lệ". Nó phải làm với hình ảnh. Dưới đây là mã của tôi. Cứu giúp?!Sự cố khi tải hình ảnh từ Android lên Rails Server bằng cách sử dụng PaperClip

public void post(String url) { 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpContext localContext = new BasicHttpContext(); 
      HttpPost httpPost = new HttpPost(url); 
      httpPost.addHeader("content_type","image/jpeg"); 
      try { 
       MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
       entity.addPart("picture_file_name", new StringBody("damage.jpg")); 
       File file = new File((imageUri.toString())); 
       entity.addPart("picture", new FileBody(file, "image/jpeg")); 
       httpPost.setEntity(entity);   
       HttpResponse response = httpClient.execute(httpPost, localContext); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

Tôi đã cố xóa thông số tương thích của trình duyệt nhưng không hiệu quả. hình ảnh của tôi đang được lưu trữ dưới dạng một URI được gọi là imageUri. Tôi đang sử dụng đá quý kẹp giấy.

cảm ơn!

Trả lời

6

Đây là cách tôi đã giải quyết.

MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
    for (NameValuePair nameValuePair : nameValuePairs) { 
     if (nameValuePair.getName().equalsIgnoreCase("picture")) { 
       File imgFile = new File(nameValuePair.getValue()); 
       FileBody fileBody = new FileBody(imgFile, "image/jpeg"); 
       multipartEntity.addPart("post[picture]", fileBody); 
     } else { 
       multipartEntity.addPart("post[" + nameValuePair.getName() + "]", new StringBody(nameValuePair.getValue())); 
     }     
    } 
httpPost.setEntity(multipartEntity); 
HttpResponse response = httpClient.execute(httpPost, httpContext); 

này sẽ tạo ra một POST như thế này:

{"post"=>{"description"=>"fhgg", "picture"=>#<ActionDispatch::Http::UploadedFile:0x00000004a6de08 @original_filename="IMG_20121211_174721.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"post[picture]\"; filename=\"IMG_20121211_174721.jpg\"\r\nContent-Type: image/jpeg\r\nContent-Transfer-Encoding: binary\r\n", @tempfile=#<File:/tmp/RackMultipart20121211-7101-3vq9wh>>}} 

Trong ứng dụng đường ray mô hình của bạn thuộc tính phải có cùng tên bạn sử dụng trong yêu cầu của bạn , vì vậy trong trường hợp của tôi

class Post < ActiveRecord::Base 
    attr_accessible :description, :user_id, :picture 

    has_attached_file :picture # Paperclip stuff 
... 
end 

Tôi cũng đã tắt mã thông báo CSRF từ ứng dụng đường ray.

Các vấn đề liên quan