当前位置: 首页 > 知识库问答 >
问题:

通过resttemplate在spring rest服务上发送文件

施永贞
2023-03-14

我有一个rest服务,接受正常参数和文件形式的多部分。

我想用resttemplate将数据和文件发送到上面的rest服务。

在我发送正常字符串数据之前,没有任何问题。一旦我添加了发送字节的代码,然后我开始得到400个坏的请求错误。

@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{

 }

 }
 public class ServiceDeskRequest implements Serializable{


private String jsonData;
private MultipartFile attachment;
}
 <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);

共有1个答案

关项明
2023-03-14

我想出来了。这个拼图有两块。服务代码没有更改。

>

  • 提供RestTemplate的右转换器。在默认转换列表中,spring没有添加FormHttpMessageConverter。

        FormHttpMessageConverter converter = new FormHttpMessageConverter();
    
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().add(converter);
    

    正在重写bytearrayresource类。请注意,您需要重写getFilename方法,以便在服务端接收文档名。

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

  •  类似资料:
    • 问题内容: 由于我是Web服务的新手,请您告诉我问题的答案。我的问题是 我想实现一个Web服务,当客户端调用此Web服务时,该服务会向客户端发送pdf文件。 请有人帮我提供一段不错的代码或解释。 现在可以请一个人解决我的错误。 12-23 09:42:48.429:调试/安装(32):DexInv:-开始’/data/app/vmdl33143.tmp’— 12-23 09:42:51.708:调

    • 我正在尝试通过REST API在服务器上上传文件。我的api请求FormData模型,但Im得到错误。 devtools中得“我得请求”得有效负载 ------WebKitFormBoundaryVpirgXMC3RU3AOFA内容-配置:表单-数据;name=“文件”;filename=“test.jpg”content-type:image/jpeg -----WebKitFormBounda

    • 我正试图通过gmail服务器通过java代码发送邮件,但面临 以下是发送邮件的代码:-` ` 这里需要注意的重要一点是,这段代码可以在某些计算机上工作。 请帮我一下,提前谢谢。

    • 问题内容: 我正在开发一个远程备份应用程序,有时我需要上传大文件,例如15 MB,我已经在某些手机上进行了测试,但遇到内存不足错误 使用此功能是否可以使用更少的内存? 这里的错误日志 修改并添加固定无缓冲区后,出现此错误 我猜这差个字节是标题数据吗?如何获取标头的length()? 问题答案: 您应该使用HttpURLConnection 的or 方法。这将防止您的数据在内存中缓冲并耗尽。 文档中