0

I want to upload images via volley using multipart and also want to show progress dialog during image upload.

I am use this code for show progress dialog when images are upload and also check this code for this.

and use below code for upload.

public void doFileUpload(ArrayList<MyUploadImage> images){
        try {
            //MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
            //entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

            JSONObject jo = new JSONObject();
            jo.put("NoOfImages", images.size());

            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(link);

            CustomMultiPartEntity multipartContent = new CustomMultiPartEntity(new ProgressListener()
            {
                @Override
                public void transferred(long num)
                {
                    pd.setProgress((int) ((num / (float) totalSize) * 100));
                }
            });

            //MultipartEntity reqEntity = new MultipartEntity();
            int size = images.size();
            for(int i = 0; i < size; i++){
                FileBody bin1 = new FileBody(images.get(i).getImageFile());

                multipartContent.addPart(("uploaded_file"+i), bin1);
            }

            multipartContent.addPart("girish", new StringBody(jo.toString()));
            totalSize = multipartContent.getContentLength();

            post.setEntity(multipartContent);
            HttpResponse response = client.execute(post);

            HttpEntity resEntity = response.getEntity();

            final String response_str = EntityUtils.toString(resEntity);

            Log.e("Response", response_str);

            pd.dismiss();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
            pd.dismiss();
        } catch (Exception e) {
            e.printStackTrace();
            pd.dismiss();
        }

    }

Thanks

Community
  • 1
  • 1
Girish Bhutiya
  • 3,111
  • 5
  • 31
  • 50

1 Answers1

0

Volley doesnt provide support for Multipart. But you can still use volley's framework and provide you own implementation of HttpStack just like we used for SSL connections.

public class MultiPartRequest extends JsonRequest<JSONObject> {

    /* To hold the parameter name and the File to upload */
    private Map<String,File> fileUploads = new HashMap<String,File>();

    /* To hold the parameter name and the string content to upload */
    private Map<String,String> stringUploads = new HashMap<String,String>();

    public void addFileUpload(String param,File file) {
        fileUploads.put(param,file);
    }

    public void addStringUpload(String param,String content) {
        stringUploads.put(param,content);
    }

    public Map<String,File> getFileUploads() {
        return fileUploads;
    }

    public Map<String,String> getStringUploads() {
        return stringUploads;
    }
}

And in your HttpStack implementation, create MultiPartEntity and set it to HttpRequest. Refer SslHttpStack createHttpRequest method for more details.

private static void setMultiPartBody(HttpEntityEnclosingRequestBase httpRequest, Request<?> request) throws AuthFailureError {

    // Return if Request is not MultiPartRequest
    if(request instanceof MultiPartRequest == false) {
        return;
    }

    MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);  
    //Iterate the fileUploads
    Map<String,File> fileUpload = ((MultiPartRequest)request).getFileUploads();

    for (Map.Entry<String, File> entry : fileUpload.entrySet()) {
        multipartEntity.addPart(((String)entry.getKey()), new FileBody((File)entry.getValue()));
    }

    //Iterate the stringUploads
    Map<String,String> stringUpload = ((MultiPartRequest)request).getStringUploads();

    for (Map.Entry<String, String> entry : stringUpload.entrySet()) {
        try {
            multipartEntity.addPart(((String)entry.getKey()), new StringBody((String)entry.getValue()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    httpRequest.setEntity(multipartEntity);
}

See this soluction here : https://github.com/smanikandan14/Volley-demo

Anderson K
  • 5,445
  • 5
  • 35
  • 50