Announcement Announcement Module
No announcement yet.
Making a multipart post request for a byte[] (jpeg) in android restTemplate Page Title Module
Move Remove Collapse
Conversation Detail Module
  • Filter
  • Time
  • Show
Clear All
new posts

  • Making a multipart post request for a byte[] (jpeg) in android restTemplate

    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 ):
    PNG("image/png", "image/x-png")
    JPG("image/jpeg", "image/jpg", "image/pjpeg")

    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:

        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 = "";
        HttpHeaders requestHeaders = new HttpHeaders();
        // Sending 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 =, HttpMethod.POST, requestEntity,
        // Return the response body to display to the user
        Log.i(TAG, "**** response.body : " + response.getBody());

  • #2
    I'm dealing with a very similar problem. Did you ever get it working?