Java获取IO流(byte流)后,通过RestTemplate把文件以mulitipartfile格式上传

这篇博客讲述了如何在Java中处理从其他系统接口获取的文件流,并将其作为multipartFile上传到其他系统。作者介绍了将流转为file文件,然后转换为multipartFile的传统方法,以及使用RestTemplate和InputStreamResource直接上传的方法。在过程中遇到了文件名中文乱码的问题,通过检查RestTemplate的配置,特别是AllEncompassingFormHttpMessageConverter的multipartCharset字段,最终解决了乱码问题。此外,博客还提及了需要引入javax.mail包的依赖。

背景:

后台从其他系统的接口,获取文件流,再把文件流以mulitipartfile调用接口传给其他系统。

通用方法:

把流转成file文件,存放到本地,再读取本地的file文件,调用接口传递。

1.把file文件转成mulitipartfile,再调用接口

常见两种方法 :

MultipartFile multipartFile = new MockMultipartFile(file.getName(), inputStream);

CommonMultipartFile 

2.通过`RestTemplate`上传文件(InputStreamResource详解)

转载:https://www.cnblogs.com/paxing/p/11485049.html

因为我的是byte流文件,所以最实用用ByteArrayResource

public void loadValue(){
    	byte [] byteArray = null;//文件流
    	ByteArrayResource byteArrayResource = new ByteArrayResource(byteArray){
			@Override
			public String getFilename() {
				//重写文件名称
				return super.getFilename();
			}
    	};
    	MultiValueMap<String, Object> dataMap = new LinkedMultiValueMap<>();
    	dataMap.add("filename", byteArrayResource);// 添加文件到表单
    	HttpHeaders requestHeaders = new HttpHeaders();
    	requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
    	HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(dataMap, requestHeaders);
    	
    	restTemplate.postForObject("url", requestEntity, JSONObject.class);
    	
    }

以上方法 可以正确把文件上传过去。但是会碰到一个新问题。文件名是中文乱码。

正常来说,文件名称已经重写,不会乱码。乱码的点 应该在RestTemplate上。查看RestTemplate的配置

public RestTemplate resttemplate(){
		RestTemplate restTemplate = new RestTemplate();
		List<HttpMessageConverter<?>> converters =  restTemplate.getMessageConverters();
		for (HttpMessageConverter<?> httpMessageConverter : converters) {
			if (httpMessageConverter instanceof StringHttpMessageConverter) {
				((StringHttpMessageConverter)httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));
			}
		}
		return restTemplate;
	}

只是string的编码定义。查看List<HttpMessageConverter<?>>内部的编码 ,发现了AllEncompassingFormHttpMessageConverter中包含multipartCharset字段。猜测需要重写

public RestTemplate resttemplate(){
		RestTemplate restTemplate = new RestTemplate();
		List<HttpMessageConverter<?>> converters =  restTemplate.getMessageConverters();
		for (HttpMessageConverter<?> httpMessageConverter : converters) {
			if (httpMessageConverter instanceof StringHttpMessageConverter) {
				((StringHttpMessageConverter)httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));
			}
			if (httpMessageConverter instanceof FormHttpMessageConverter) {
				((FormHttpMessageConverter)httpMessageConverter).setMultipartCharset(Charset.forName("UTF-8"));
			}
		}
		return restTemplate;
	}

如图,成功解决文件名乱码问题

 

另:额外要增加 javax.mail包依赖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值