2012-07-12 10 views
6

Ich versuche, Bilder von Android auf meinen Rails-Server hochzuladen. Alle meine anderen Daten hochgeladen, aber ich bekomme eine Fehlermeldung "Fehler ungültige Körpergröße". Es hat mit dem Bild zu tun. Unten ist mein Code. Hilfe?!Probleme beim Hochladen von Bildern von Android auf den Rails-Server mit 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(); 
      } 
     } 

Ich habe versucht, den Browser kompatibel Parameter zu entfernen, aber es hilft nicht. Mein Bild wird als URI imageUri gespeichert. Ich benutze Büroklammer Juwel.

danke!

Antwort

6

So habe ich gelöst.

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

Dieses eine POST wie folgt produzieren:

{"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>>}} 

In der Rails-Anwendung Modell Attribute den gleichen Namen, den Sie in Ihrer Anfrage , so in meinem Fall verwenden müssen

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

    has_attached_file :picture # Paperclip stuff 
... 
end 

Ich habe auch das CSRF-Token von der Rails-Anwendung deaktiviert.

Verwandte Themen