欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-19 12:08:17
背景:后台从其他系统的接口,获取文件流,再把文件流以mulitipartfile调用接口传给其他系统。通用方法:把流转成file文件,存放到本地,再读取本地的file文件,调用接口传递。1.把file文件转成mulitipartfile,再调用接口常见两种方法:MultipartFile multipartFile = new MockMultipartFile(file.getName(), inputStream);CommonMultipartFile2.通过`Re.....

背景:

后台从其他系统的接口,获取文件流,再把文件流以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包依赖

本文地址:https://blog.csdn.net/c20061924/article/details/112003557

相关标签: Java