Multipart Request Using Android Volley (Error while uploading multiple images to server)

2,828 views
Skip to first unread message

Sooraj Sizon

unread,
Sep 27, 2017, 2:34:31 AM9/27/17
to Volley Users

This is the gist iam refering for uploading images to the server https://gist.github.com/anggadarkprince/a7c536da091f4b26bb4abf2f92926594

But iam using TedPicker OnMultiImageSelectedListener to select multiple images https://android-arsenal.com/details/1/4320

It gives me selectedUriList in an ArrayLIst . I convert all the Uri's to byteArray and upload to server. Here is my Code of Uploading Image .

private void imageUpload() {

   
final ProgressDialog loading = ProgressDialog.show(this,"Uploading...","Please wait...",false,false);
   
VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, Constants.UPLOAD_URL, new Response.Listener<NetworkResponse>() {
       
@Override
       
public void onResponse(NetworkResponse response) {
           
String resultResponse = new String(response.data);
           
try {
               
JSONObject result = new JSONObject(resultResponse);
               
String status = result.getString("status");
               
String message = result.getString("message");

                loading
.dismiss();

               
if (status.equals(Constants.REQUEST_SUCCESS)) {
                   
// tell everybody you have succed upload image and post strings
                   
Log.i("Messsage", message);
               
} else {
                   
Log.i("Unexpected", message);
               
}
           
} catch (JSONException e) {
                e
.printStackTrace();
           
}
       
}
   
}, new Response.ErrorListener() {
       
@Override
       
public void onErrorResponse(VolleyError error) {
            loading
.dismiss();
           
NetworkResponse networkResponse = error.networkResponse;
           
String errorMessage = "Unknown error";
           
if (networkResponse == null) {
               
if (error.getClass().equals(TimeoutError.class)) {
                    errorMessage
= "Request timeout";
               
} else if (error.getClass().equals(NoConnectionError.class)) {
                    errorMessage
= "Failed to connect server";
               
}
           
} else {
               
String result = new String(networkResponse.data);
               
try {
                   
JSONObject response = new JSONObject(result);
                   
String status = response.getString("status");
                   
String message = response.getString("message");

                   
Log.e("Error Status", status);
                   
Log.e("Error Message", message);

                   
if (networkResponse.statusCode == 404) {
                        errorMessage
= "Resource not found";
                   
} else if (networkResponse.statusCode == 401) {
                        errorMessage
= message+" Please login again";
                   
} else if (networkResponse.statusCode == 400) {
                        errorMessage
= message+ " Check your inputs";
                   
} else if (networkResponse.statusCode == 500) {
                        errorMessage
= message+" Something is getting wrong";
                   
}
               
} catch (JSONException e) {
                    e
.printStackTrace();
               
}
           
}
           
Log.i("Error", errorMessage);
       
}
   
}) {
       
@Override
       
protected Map<String, String> getParams() {
           
Map<String, String> params = new HashMap<>();
           
params.put("folder_name", FOLDER_NAME);
           
return params;
       
}

       
@Override
       
protected Map<String, DataPart> getByteData() {
           
Map<String, DataPart> params = new HashMap<>();

           
int i = 0;
           
for (Uri uri : selectedUriList) {
                i
++;
               
try {
                   
InputStream iStream = getContentResolver().openInputStream(uri);
                   
byte[] inputData = getBytes(iStream);
                   
params.put("image_file"+i, new DataPart("image"+i+".jpg", inputData , "image/jpeg"));

               
} catch (IOException e) {
                    e
.printStackTrace();
               
}

           
}

           
return params;
       
}
   
};

   
VolleySingleton.getInstance(getBaseContext()).addToRequestQueue(multipartRequest);
}

public byte[] getBytes(InputStream inputStream) throws IOException {
   
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
   
int bufferSize = 1024;
   
byte[] buffer = new byte[bufferSize];

   
int len = 0;
   
while ((len = inputStream.read(buffer)) != -1) {
        byteBuffer
.write(buffer, 0, len);
   
}
   
return byteBuffer.toByteArray();
}

The error iam facing while trying to upload image

I/System.out: [socket]rx timeout:2500
I
/System.out: [socket][0] connection ascentcity.com/119.81.195.196:80;LocalPort=45296(2500)
I
/System.out: [CDS]connect[ascentcity.com/119.81.195.196:80] tm:2
D
/Posix: [Posix_connect Debug]Process com.vst.image.vehiclestimageclassifier :80
I
/System.out: [socket][/192.168.31.42:45296] connected
I
/System.out: [socket]rx timeout:2500
D
/Volley: [22832] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://ascentcity.com/Mobileapp/upload.php 0x43980958 NORMAL 1> [lifetime=48143], [size=116], [rc=200], [retryCount=0]
W
/System.err: org.json.JSONException: Value Sorry of type java.lang.String cannot be converted to JSONObject
W
/System.err:     at org.json.JSON.typeMismatch(JSON.java:111)
W
/System.err:     at org.json.JSONObject.<init>(JSONObject.java:160)
W
/System.err:     at org.json.JSONObject.<init>(JSONObject.java:173)
W
/System.err:     at com.vst.image.vehiclestimageclassifier.MainActivity$3.onResponse(MainActivity.java:171)
W
/System.err:     at com.vst.image.vehiclestimageclassifier.MainActivity$3.onResponse(MainActivity.java:166)
W
/System.err:     at com.vst.image.vehiclestimageclassifier.VolleyMultipartRequest.deliverResponse(VolleyMultipartRequest.java:127)
W
/System.err:     at com.vst.image.vehiclestimageclassifier.VolleyMultipartRequest.deliverResponse(VolleyMultipartRequest.java:24)
W
/System.err:     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
W
/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
W
/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
W
/System.err:     at android.os.Looper.loop(Looper.java:157)
W
/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5429)
W
/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W
/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W
/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

I have a few questions

  1. Is it okay to retrive byte data from images like this or there are better ways ?
        @Override
       
    protected Map<String, DataPart> getByteData() {
           
    Map<String, DataPart> params = new HashMap<>();

           
    int i = 0;
           
    for (Uri uri : selectedUriList) {
                i
    ++;
               
    try {
                   
    InputStream iStream = getContentResolver().openInputStream(uri);
                   
    byte[] inputData = getBytes(iStream);
                   
    // file name could found file base or direct access from real path
                   
    // for now just get bitmap data from ImageView
                   
    params.put("image_file"+i, new DataPart("image"+i+".jpg", inputData , "image/jpeg"));

               
    } catch (IOException e) {
                    e
    .printStackTrace();
               
    }

           
    }

           
    return params;
       
    }
    Enter code here...

  2. The error iam facing is due to slow server ? or something else ? how to debug this?

  3. Is there something i need to communicate to backend team (Server Side) , imean to handle my request .

Here is the github link to complete project code https://github.com/sooorajjj/vstImageClassifier 

Thanks!

Jatin singh

unread,
Nov 8, 2017, 1:05:24 AM11/8/17
to Volley Users
This is an advance example of Volley in which we will fetch data from server API using Volley. Our API contains three things title, image and category details which we will fetch in App using Volley. http://abhiandroid.com/programming/volley
Reply all
Reply to author
Forward
0 new messages