在很多时候我们会遇到微服务之间文件传输,很多时候我们可以通过序列化等方式解决(如图片等)。
最近项目中有个excel上传,以及多媒体文件上传,直接报错。
也试了2种解决方式,都不可行。
1.写一个文件Encoder解析器,会出现其他的rest请求出现encoder错误
2.springcloud feign有一个规范,不可以传输2个对象,可以是一个对象带几个参数方式。
那么我们现在需要一种方式,不配置全局的解析器,而是通过Feign Builder 去管理上传文件,这种方式管理起来也较为方便。
引用包
com.netflix.feign
feign-core
8.17.0
com.netflix.feign
feign-jackson
8.17.0
com.netflix.feign
feign-slf4j
8.17.0
调用方式
@ApiOperation(value = "上传Excel", notes = "上传Excel")
@RequestMapping(value = "/imExcel", method = RequestMethod.POST, produces = request_headers)
public ActionResult imExcel(@RequestBody MultipartFile file,@RequestParam("operatorId") Integer operatorId){
if(file == null || file.isEmpty()|| operatorId==null)
return new ActionResult<>(ResultType.BAD_REQUEST,"文件与操作用户ID都不能为空");
String fileName = file.getOriginalFilename();
if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) {
return new ActionResult<>(ResultType.BAD_REQUEST,"上传文件格式错误,请上传后缀为.xls或.xlsx的文件");
}
Feign.Builder encoder = Feign.builder()
.decoder(new JacksonDecoder())
.encoder(new FeignEncoder());
FileUpload complainFileUpload = encoder.target(FileUpload.class,LABEL_URL);
return complainFileUpload.imComplainExcel(file,operatorId);
}
文件Encode
import feign.RequestTemplate;
import feign.codec.EncodeException;
import feign.codec.Encoder;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;