2012-09-23 32 views
3

我試圖從Android發送圖片到rails服務器。但是當我發送時,我收到以下錯誤。「org.apache.http.client.NonRepeatableRequestException」從Android上傳圖片時

09-19 23:22:11.810: W/System.err(2704): org.apache.http.client.ClientProtocolException                       
09-19 23:22:12.000: W/System.err(2704):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:557) 
09-19 23:22:12.020: W/System.err(2704):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
09-19 23:22:12.020: W/System.err(2704):  at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:73) 
09-19 23:22:12.050: W/System.err(2704):  at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:92) 
09-19 23:22:12.050: W/System.err(2704):  at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:54) 
09-19 23:22:12.050: W/System.err(2704):  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:444) 
09-19 23:22:12.050: W/System.err(2704):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
09-19 23:22:12.050: W/System.err(2704):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
09-19 23:22:12.050: W/System.err(2704):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
09-19 23:22:12.060: W/System.err(2704):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
09-19 23:22:12.070: W/System.err(2704):  at java.lang.Thread.run(Thread.java:1019) 
09-19 23:22:12.250: W/System.err(2704): Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity 
09-19 23:22:12.320: W/System.err(2704):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:413) 
09-19 23:22:12.360: W/System.err(2704):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
09-19 23:22:12.370: W/System.err(2704):  ... 10 more 

有什麼不可思議的是我每次上傳圖片都不會收到這個錯誤,有時候只是在做同樣的過程。這是我的代碼。我正在使用「AsyncHttpClient」(http://loopj.com/android-async-http/)進行http連接。

public class AsynchConnector{ 
    static AsyncHttpClient client = new AsyncHttpClient(); 
    private static final String BASE_URL = Environment.SERVER_URL; 

    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){ 
     Log.w("web", "sending POST requset to " + getAbsoluteUrl(url)); 
     client.post(getAbsoluteUrl(url), params, responseHandler); 
    } 
} 


public static void postPicture(String serverAlbumId, String serverUserId, String filePath){ 
    RequestParams params = new RequestParams(); 
    params.put("user_id", CameraApp.sp.getString("server_user_id", "")); 
    params.put("picture[album_id]", serverAlbumId); 
    params.put("picture[user_id]", serverUserId); 

    try{ 
     params.put("picture[image]", StorageAccessor.getPictureAsFile(filePath)); 
    }catch(FileNotFoundException e){ 
     Log.e("---", "no image file found "); 
    } 

    Log.i("----------", "starting to post picture"); 
    AsynchConnector.post(PICTURE_PATH, params, new AsyncHttpResponseHandler(){ 
     public void onSuccess(String response) { 
      Log.i("POST_PICTURE_RESOPNSE", response); 
     } 
    }); 
} 
+0

你曾經能夠解決這個問題嗎?我有完全相同的問題,我的代碼與您的代碼非常相似。 – svguerin3

+1

我認爲這是由於AsynchHttpClient中使用的OutputStream編寫器。這篇文章可能有助於理解發生的事情。 http://old.nabble.com/Http-Multi-part-exception-when-using-InputStreamBody-td22673677.html 我解決了這個通過實施ResponseHandler所onFailure處(Throwable的誤差)方法做同樣的事情再次。 (在我的情況下,調用postPicture方法。) – Ryo

+0

任何運氣找到解決方案? –

回答

1

這是由於AsynchHttpClient中使用的OutputStreamWriter類。這篇文章可能有助於理解發生的事情。

http://httpcomponents.10934.n7.nabble.com/Http-Multi-part-exception-when-using-InputStreamBody-td12820.html

我解決了這個通過實施ResponseHandler所onFailure處(Throwable的誤差)方法,再次做同樣的事情。 (在我的情況下,調用postPicture方法。)

+1

我試過這個解決方案,但現在我通過onFailure方法得到了一個永無止境的循環。我正在實施你的解決方案嗎? – Takide