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

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

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

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值