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

4733

被折叠的 条评论
为什么被折叠?



