Java获取IO流(byte流)后,通过RestTemplate把文件以mulitipartfile格式上传
背景:
后台从其他系统的接口,获取文件流,再把文件流以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中的泛型
下一篇: 一个小测试的2020年终总结