【SpringBoot】使用RestTemplate在服务之间进行MultipartFile格式文件的传递

    技术2022-07-20  68

    文章目录

    1、前言2、原因分析3、解决办法

    1、前言

    最近开发过程中遇到这样的问题,在使用RestTemplate进行两个后台服务之间文件传递的时候,直接使用MultipartFile格式来传递的时候抛出异常。

    2、原因分析

    MultipartFile是Spring框架中提供的一种用于文件处理的接口,一般用于前端进行文件的上传,后端使用MultipartFile类型来进行文件的接收;当使用RestTemplate的post方法进行来传递接收到的MultipartFile类型文件时,由于RestTemplate中并没有对应的转化器(Converter),无法将文件对象打包进body中,所以会抛出异常。

    关于RestTemplate的详细解析,可以参考该博客:RestTemplate原理与使用

    3、解决办法

    (1)先将MultipartFile类型的对象转化为File类型,一下为转换的方法:

    /** * 将MultiPartFile转化为File * @param path * @param multiFile * @return * @throws IOException */ public static File multiPartFileToFile(String path,MultipartFile multiFile) throws IOException { File file=new File(path); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } file.createNewFile(); multiFile.transferTo(file); return file; }

    (2)选择适当的RestTemplate转换器

    第一种方法:

    public JSONObject upload(String url,MultipartFile file){ String path=xxxxxx/xx.mp4; File tempFile=FileConvertUtil.multiPartFileToFile(path, file); // 构建HttpEntity MultiValueMap<String, Object> param = new LinkedMultiValueMap<>(); param.add("file", new FileSystemResource(tempFile)); HttpHeaders headers=new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); HttpEntity<MultiValueMap<String, Object>> httpEntity=new HttpEntity<>(param, headers); JSONObject jsonObject=restTemplate.postForEntity(url, httpEntity, JSONObject.class).getBody(); return jsonObject; }

    这种方式使用了ResourceHttpMessageConverter的转换方法来实现params到body内容的转换。

    也可以使用第二种方法,使用ByteArrayHttpMessageConverter转换器:

    public JSONObject upload(String url,MultipartFile file){ String path=xxxxxx/xx.mp4; File tempFile=FileConvertUtil.multiPartFileToFile(path, file); MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); headers.add(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("file", new ByteArrayResource(tempFile)) { @Override public String getFilename() { return file.getOriginalFilename(); } }); JSONObject jsonObject=restTemplate.postForEntity(url, httpEntity, JSONObject.class).getBody(); return jsonObject; }

    在开发中使用的是第一种方法,第二种没试过,有兴趣的可以试一下。

    Processed: 0.014, SQL: 9