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

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

    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());

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

    Comment

    Working...
    X