0

I am trying to send post parameter as user name and image as multiform data using volley in android. I am creating body as well as sending parameters but it seems that body of post service is somehow overwriting the parameter as its given from the server. I am using customized request class and code written in it is as follow:

public abstract class CustomJsonRequest<T> extends Request<T> {
 ................

  @Override
protected Map<String, String> getParams() throws AuthFailureError {
   // return super.getParams();
    HashMap<String, String> map = new HashMap<>();
    map.put("userName", requestParameters.get("userName"));

    return map;
}

public byte[] getBody() throws AuthFailureError {
    return createPostBody(requestParameters).getBytes();
}


private String createPostBody(Map<String, String> params) {
    StringBuilder sbPost = new StringBuilder();
    if (params != null) {

        // for (String key : params.keySet()) {
        if (params.get("image") != null) {
            sbPost.append("\r\n" + "--" + BOUNDARY + "\r\n");
            sbPost.append("Content-Disposition: form-data; name=\"" + "image" + "\"" + "\r\n\r\n");
            sbPost.append(params.get("image"));
        }
        //}
    }
    return sbPost.toString();
}

 }

On debugging I could see getParameters no being called. My aim is to send post parameter with image as its post body using volley in android. In Ios its using alamofire and its succesfully uploaded by following code.

  func uploadImage(userImage: UIImage, completion: (result: RestResultType) -> Void) {
    let parameters = ["userName": localData.getAccessToken()]
    let url = domain + RestExt.imageUpload.rawValue

    Alamofire.upload(.POST, url, multipartFormData: {
        multipartFormData in

        let imageData = UIImageJPEGRepresentation(userImage, 0.5)
        if(imageData == nil) {
            completion(result: .Error(e: method(code: "ImageConversionError",message: "")))
            return
        }

        multipartFormData.appendBodyPart(data: imageData!, name: "image", fileName: "image.png", mimeType: "image/png")
        for (key, value) in parameters {
            multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
        }

        }, encodingCompletion: {
            encodingResult in

            switch encodingResult {
            case .Success(let upload, _, _):
                upload.responseJSON {
                    response in
                    switch response.result {
                    case .Success(let JSONResponse) :
                        let response = JSONResponse as! NSDictionary
                        let error = response.objectForKey("error") as? NSDictionary
                        if(error != nil) {
                            completion(result: .Error(e: method(JSONDictionary: error!)))
                        }
                        else {
                            completion(result: .Success(r: response))
                        }

                    case .Failure(let err):
                       }
                }
            case .Failure(let encodingError):
                print(encodingError)
            }
    })
} 
karan421
  • 863
  • 17
  • 43

1 Answers1

0

I used to send image converted as a string. This works for me...

public static void uploadImage(final String userName, final Bitmap bitmap, final Bitmap thumbBitmap, final Activity activity) {
    //Showing the progress dialog

    String UPLOAD_URL = "your/url/address";
    RequestQueue queue = Volley.newRequestQueue(activity);
    final String image = getStringImage(bitmap);

    final ProgressDialog loading = ProgressDialog.show(activity, "Uploading...", "Please wait...", false, false);
    StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String s) {

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    //Dismissing the progress dialog
                    loading.dismiss();
                }
            }) {

        protected Map<String, String> getParams() throws AuthFailureError {
            //Converting Bitmap to String
            String image = getStringImage(bitmap);
            //Getting Image Name

            String name = "user_name";

            //Creating parameters
            Map<String, String> params = new Hashtable<String, String>();

            //Adding parameters
            params.put("image", image);
            params.put("userName", name);

            //returning parameters
            return params;
        }
    };

    //Adding request to the queue
    queue.add(stringRequest);
}

   public static String getStringImage(Bitmap bmp) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] imageBytes = baos.toByteArray();
    String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);

    return encodedImage;
}
Dejan Dimčić
  • 294
  • 1
  • 3
  • 9