1

I am trying to upload an image to a PHP file on a server using the POST method. I have been trying to do this using LoopJ AndroidAsyncHttp with no success. The server also requires a basic auth username and password. So far, I have been able to successfully POST the regular data parameters (These are simple string key-valued pairs like: "name":"joe") and get a response from the server. However, as soon as I try to attach the image to the POST request, the request fails giving me the following errors:

Error Message: null
Error Cause: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity

The code that I am using follows the examples given at http://loopj.com/android-async-http/ very closely. Here is the code that I am using:

RequestParams params = new RequestParams();
params.put("name",name);


String path = "/path/to/img";
File myFile = new File(path, "picture.png");

if( myFile.exists() ) {
    try {
        params.put("picture", myFile);
    } catch(FileNotFoundException e) {
        Log.d("App","Error Attaching Picture: " + e.toString());
    }
} else {
    Log.d("App","File DOES NOT exist");
}


String urlString = "url-to-server";
AsyncHttpClient client = new AsyncHttpClient();
client.setBasicAuth("User", "Pass");
client.post(urlString, params, new AsyncHttpResponseHandler(){
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            super.onSuccess(statusCode, headers, responseBody);
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            super.onFailure(statusCode, headers, responseBody, error);
            Log.d("App","Upload Failed!");
            Log.d("App","Error Message: " + error.getMessage());
            Log.d("App", "Error Cause: " + error.getCause());                   
        }

        @Override
        public void onStart() {
            super.onStart();
        }
});

So what am I doing wrong here? I have also double checked and the file that I am reading to get the image does exist and it does have data in it, so I have ruled that out as a potential cause. I have been struggling with this issue a little too long now. Thanks in advance to anyone who can help!

Stephane Landelle
  • 6,990
  • 2
  • 23
  • 29
Takide
  • 335
  • 3
  • 10

1 Answers1

1

This was a bug in the old 1.4.4 version of AsyncHTTPClient. It can be fixed by updating to the 1.4.8 version. In your build.gradle file under the dependencies section it should look like this:

compile 'com.loopj.android:android-async-http:1.4.8'
Takide
  • 335
  • 3
  • 10