SpringBoot,通过RestTemplate 或者 Spring Cloud Feign,上传文件(支持多文件上传),服务端接口是MultipartFile接收。
将文件的字节流,放入ByteArrayResource中,并重写getFilename方法。
然后将ByteArrayResource放入MultiValueMap中(如果是Feign调用,方法里传参就是MultiValueMap),
然后进行上传时,Spring会自动识别到Map中的文件数据,然后通过FormHttpMessageConverter,将数据转成form表单型的multipart/formdata请求。
这里有个坑!
Spring web 4里面的FormHttpMessageConverter在将文件转成formdata时,会将文件名转成Byte[],但是使用的编码却是写死 US-ASCII,该编码不支持中文,使用该编码转换后,中文变成?号,是无法转回来的。
我想到的解决方法:
1.将spring版本升到5,Spring5里面,该编码是可以传入修改的。Springboot,默认UTF8
2.客户端进行一次编码,比如URLEncoder。然后服务端进行Decoder。
贴部分代码:
====================== 分割线 =================================
我在查询Feign上传文件时,还查到了另一种方式,就是专门给Feign方式提供的feign form相关Jar包,
引入Jar包后,然后进行相关配置,便可以在Feign方法中,参数直接传递MultipartFile。
该方法,或许也可以解决Spring4的编码问题。