通过resttemplate在spring rest服务上发送文件 [英] Sending file over spring rest service via resttemplate

查看:1799
本文介绍了通过resttemplate在spring rest服务上发送文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

标题可能看起来很常见,但它们都不适合我的问题。

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.

我想使用resttemplate将数据和文件发送到上述休息服务。

i want to use resttemplate to send data and file to above rest service.

直到我发送正常字符串为止数据没有问题。一旦我添加发送字节的代码然后我开始得到 400错误请求错误。

till the time i was sending normal string data there was no issue. once i add code of sending bytes then i start getting 400 Bad request error.

如果我评论代码发送ByteArrayResource然后它开始工作正常参数。

if i comment code to send ByteArrayResource then it start working for normal parameters.

下面是示例代码

休息服务控制器

@RestController
@RequestMapping(value="/ticket")
public class UserTicketController {

 @RequestMapping(value="/createTicket.do",method={RequestMethod.POST},
        consumes = {MediaType.MULTIPART_FORM_DATA_VALUE},headers={"content-type="+MediaType.MULTIPART_FORM_DATA_VALUE})
public void createTicket(@ModelAttribute ServiceDeskRequest serviceDeskRequest, HttpServletRequest request,HttpServletResponse response) throws Exception{

 }

 }

Servicedeskrequest模型属性是

Servicedeskrequest model attribute is

 public class ServiceDeskRequest implements Serializable{


private String jsonData;
private MultipartFile attachment;
}

application-context.xml

application-context.xml

 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean> 

客户端代码

RestTemplate restTemplate = new RestTemplate();
        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());
            requestParamerterMap.add("attachment", byteArrayResource);
        }

        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(targetUrl, requestEntity, String.class);


推荐答案

我想通了。这个难题有两个部分。服务代码没有变化。

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


  1. 提供正确的转换器来重新模板化。在默认转换列表中,spring不会添加FormHttpMessageConverter。

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


  • 覆盖bytearrayresource类。请注意,您需要覆盖 getFilename 方法,以便可以在服务端接收文档名称。

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

    这篇关于通过resttemplate在spring rest服务上发送文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆