2011-11-22 13 views
12

Próbowałem przesłać zdjęcie do serwera przez HttpClient w telefonie z Androidem, ale czasami pojawia się ten błąd, nie zawsze dzieje się to. ktoś wie, jak go rozwiązać?Nie udało się HttpPost z powodu "Nie można ponowić żądania z nieodwracalnym obiektem żądania"

mój kod jak:

HttpClient client =new DefaultHttpClient(); 
HttpPut httpPut = new HttpPut(uploadUrl);  
InputStream in =null; 
HttpResponse response =null; 
     try { 
      in = new FileInputStream(filepath); 
      BasicHttpEntity entity = new BasicHttpEntity(); 
      entity.setContent(in); 
      entity.setContentLength(new File(basepath+path).length()); 

      httpPut.setEntity(entity); 
      response = client.execute(httpPut); 
      System.out.println(response.getStatusLine()); 


      consume(response.getEntity()); 


     } 

.......

informacji o błędzie:

11-22 10:32:50.370: W/System.err(15224): org.apache.http.client.ClientProtocolException 
11-22 10:32:50.370: W/System.err(15224): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:557) 
11-22 10:32:50.370: W/System.err(15224): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
11-22 10:32:50.370: W/System.err(15224): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
11-22 10:32:50.370: W/System.err(15224): at com.hp.nimbus.android.skydrive.util.SkyDriveUtils_Rest.doUploadPhoto(SkyDriveUtils_Rest.java:203) 
11-22 10:32:50.380: W/System.err(15224): at com.hp.nimbus.android.skydrive.util.SkyDriveUtils_Rest.uploadPhoto(SkyDriveUtils_Rest.java:250) 
11-22 10:32:50.380: W/System.err(15224): at com.hp.nimbus.android.skydrive.FolderMonitorService$1.onEvent(FolderMonitorService.java:36) 
11-22 10:32:50.380: W/System.err(15224): at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:125) 
11-22 10:32:50.380: W/System.err(15224): at android.os.FileObserver$ObserverThread.observe(Native Method) 
11-22 10:32:50.380: W/System.err(15224): at android.os.FileObserver$ObserverThread.run(FileObserver.java:88) 
11-22 10:32:50.380: W/System.err(15224): Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity 
11-22 10:32:50.380: W/System.err(15224): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:419) 
11-22 10:32:50.380: W/System.err(15224): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
11-22 10:32:50.390: W/System.err(15224): ... 8 more 
+0

Witam, dziękuję za odpowiedź. Próbowałem wcześniej FileEntity, problem polega na tym, że serwer przesyłania nie obsługuje FileEntity, muszę użyć FileInputStream. Wspomniałeś, że początkowe żądanie nie powiodło się, czy jest w stanie poznać przyczynę niepowodzenia? – user1059217

+3

Brak obsługi 'FileEntity' brzmi dziwnie. Aby uzyskać prostą poprawkę, spróbuj owinąć swój obiekt wewnątrz obiektu BufferedHttpEntity - spowoduje to, że będzie on powtarzalny, ale przeżyje trochę więcej pamięci. – Jens

Odpowiedz

6

Oznacza to, że pierwotny wniosek nie powiodła się, a ponieważ jest to strumień jest możliwe powtórzyć to.

Jeśli usuniesz FileInputStream i zamiast tego użyjesz FileEntity, uważam, że będzie powtarzalny.

Nie musisz także ustawiać długości.

2

Może być trochę spóźniony, aby odpowiedzieć na to pytanie, ale dla osób, które lądują na tej stronie, powodem wyjątku jest BasicHttpEntity, nie pozwala na powtarzalne żądania. Będziesz musiał użyć odpowiedniej implementacji HttpEntity.

W przypadku tego pytania będzie to FileEntity, jak wspomniał Matthew Flaschen w drugiej odpowiedzi, ale w większości innych przypadków można użyć StringEntity, co pozwala na powtarzalne żądania.

Powiązane problemy