rellocs wood
rellocs wood

Reputation: 1481

Spring Resttemplate : how to post file and common String data at the same time

I meet a request to upload files with spring resttemplate to upload files with http header "multipart/form-data", also some other normal parameters need to be posted. how to implements that?

Upvotes: 1

Views: 7436

Answers (3)

Gursewak Singh
Gursewak Singh

Reputation: 172

You can use the following code in your application to have both multipart-file and normal request parameters at the same time:

Note:

  • replace the URL with your own
  • replace parameter names and values according to your normal parameters
String url = "http://example.com";
String fileAbsPath = "absolute path of your file";
String fileName = new File(fileAbsPath).getName();

Files.readAllBytes(Paths.get(fileAbsPath));

MultiValueMap<String, Object> data = new LinkedMultiValueMap<String, Object>();

ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(Paths.get(fileAbsPath))) {
    @Override
    public String getFilename() {
        return fileName;
    }
};

data.add("file", resource);

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("file","application/pdf");

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
    .queryParam("param1", "value1")
    .queryParam("param2", "value2");

HttpEntity<> entity = new HttpEntity<> (data, requestHeaders);

RestTemplate restTemplate = new RestTemplate();

ResponseEntity<String> result =restTemplate.exchange(
    builder.toUriString(),
    HttpMethod.POST,
    entity,
    String.class
);

System.out.println(result.getBody());

Upvotes: 3

SkyCity
SkyCity

Reputation: 29

I got the error "cannot be cast to java.lang.String" although my code does not have any casting.

enter image description here

Upvotes: 0

best wishes
best wishes

Reputation: 6644

you can use this code.

   HttpHeaders headers = getCASHeaders(MediaType.MULTIPART_FORM_DATA);
   LinkedMultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
   params.add("fileField", new FileSystemResource(""));//get file resource
   params.add("stringfield", stringPayload);
   HttpEntity requestEntity = new HttpEntity<>(params, headers);
   ResponseEntity<CasAssetApiResponse> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);

This will send post call with two param, you can add more according to your wish.

Please have a look at this stackoverflow answer as well

Upvotes: 1

Related Questions