Sending file over spring rest service via resttemplate

前端 未结 2 1792
离开以前
离开以前 2021-01-15 05:26

Title might look common but none of them fit in my issue.

I have a rest service which accept normal parameters and file in form of multipart.

i want to use r

相关标签:
2条回答
  • 2021-01-15 05:56

    First, value="/createTicket.do" is way off the REST convention. Same goes for /ticket. Creation of a ticket should be done by POST to URL: .../tickets/

    0 讨论(0)
  • 2021-01-15 06:03

    I figured it out. There are two piece in this puzzle. No change in service code.

    1. Providing right converter to resttemplate. In list of default converts spring doesn't add FormHttpMessageConverter.

          FormHttpMessageConverter converter = new FormHttpMessageConverter();
      
          RestTemplate restTemplate = new RestTemplate();
          restTemplate.getMessageConverters().add(converter);
      
    2. overriding bytearrayresource class. plz note you need to override getFilename method so that document name can be received at service side.

           public class MultipartByteArrayResource extends ByteArrayResource{
      
           private String fileName;
      
            public MultipartByteArrayResource(byte[] byteArray) {
                   super(byteArray);
               }
      
            public String getFilename() { 
                return fileName; 
              }
      
            public void setFilename(String fileName) {
                this.fileName= fileName;
             }
      
         }
      

    After above changes client code will be

           FormHttpMessageConverter converter = new FormHttpMessageConverter();
    
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(converter);
    
            MultiValueMap<String, Object> requestParamerterMap = new LinkedMultiValueMap<String, Object>();
    
            requestParamerterMap.add("jsonData", jsonData);
    
            MultipartFile attachment = userRequest.getAttachment();
    
            if(attachment!=null && attachment.getOriginalFilename()!=null) {
                //ByteArrayResource byteArrayResource = new ByteArrayResource(attachment.getBytes(), attachment.getOriginalFilename());
    
                MultipartByteArrayResource resource = new MultipartByteArrayResource(attachment.getBytes());
    
               //pass file name sepratly 
               resource.setFilename(attachment.getOriginalFilename());
    
                requestParamerterMap.add("attachment", resource);
            }
    
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    
            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(requestParamerterMap, headers);
    
            String response = restTemplate.postForObject(targetUrls.get("sdCreateTicketsUrl"), requestEntity, String.class);
    
    0 讨论(0)
提交回复
热议问题