Hi,
I've been using spring for android successfully in my android app to get/post data from/to the server. Now, I have to do a post request for a multipart form, but I've been unable to get it working the way I want.

Use case:
1. Pick a photo from the gallery
2. Load it to a bitmap using the file source
3. Compress the bitmap to a ByteArrayOutputStream
4. Pass the byte array ( ByteArrayOutputStream.toByteArray() ) to the server. (I need to send this as jpeg not application/octet-stream)

The server endpoint for upload photo accepts a MultipartFile with only the following Mime types ( Note, it does not accept MimeType: application/octet-stream ):
GIF("image/gif")
PNG("image/png", "image/x-png")
JPG("image/jpeg", "image/jpg", "image/pjpeg")
BMP("image/bmp")

I've tried using the sample code, but been unsuccessful so far.

With the following code I get the following error:
org.springframework.web.bind.MissingServletRequest ParameterException: Required MultipartFile parameter 'file' is not present

Help on this matter is greatly appreciated. Thanks and keep up the good work.

Here's my code:

Code:
    bitmap = BitmapFactory.decodeFile("/mnt/sdcard/DCIM/Camera/20130205_162546.jpg");
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 60, bos);
    byte[] data = bos.toByteArray();

    // populate the data to post
    MultiValueMap<String, Object> formData = new LinkedMultiValueMap<String, Object>();
    formData.add("caption", "Test Caption");
    formData.add("file", data);

    // The URL for making the POST request
    final String url = "http://api.example.com/imageUpload?oauth_token=XXXXXX";

    HttpHeaders requestHeaders = new HttpHeaders();

    // Sending multipart/form-data
    requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

    // Populate the MultiValueMap being serialized and headers in an HttpEntity object to use for the request
    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(
            formData, requestHeaders);

    // Create a new RestTemplate instance
    RestTemplate restTemplate = new RestTemplate(true);

//    // Set a custom message converter that supports the application/json media type
//    final GsonHttpMessageConverter gsonMessageConverter = new GsonHttpMessageConverter();
//    gsonMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
//    final ByteArrayHttpMessageConverter byteArrayMessageConverter = new ByteArrayHttpMessageConverter();
//    byteArrayMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.IMAGE_JPEG));
//    final FormHttpMessageConverter formMessageConverter = new FormHttpMessageConverter();
//    formMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.IMAGE_JPEG));
//    restTemplate.getMessageConverters().addAll(Arrays.asList(gsonMessageConverter, byteArrayMessageConverter, formMessageConverter));

    // Make the network request, posting the message, expecting a String in response from the server
    ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity,
            String.class);

    // Return the response body to display to the user
    Log.i(TAG, "**** response.body : " + response.getBody());