Feign实现文件传输
使用feign远程调用上传文件接口踩坑记录:
之前写的一直报错file文件为空。feign.FeignException: status 400 Required request part ‘file‘ is not present问题解决。
1.在feign项目中添加依赖
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.2.2</version>
</dependency>
2.在feign项目中增加配置类
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Author: shx
* Date: 2024/5/15 16:21
*/
@Configuration
public class MultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
}
3.feign接口中的client接口中定义文件参数为,其中尤为重要是在@RequestMapping里面增加 method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE(因为我们接口是form-data表单提交所以这边一定要声明)其次就是 用@RequestPart来接收文件参数 MultipartFile file
@RequestMapping(value = "/caseFile/uploadImageAndDrawWatermark", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public BaseResp uploadImageAndDrawWatermark(@RequestPart(value="imgFile", required = false) MultipartFile file,
@RequestParam(value="caseFromOrgId", required = false) Integer caseFromOrgId,
@RequestParam(value="caseId", required = false) String caseId,
@RequestParam(value="taskId", required = false) String taskId,
@RequestParam(value="lon", required = false) String lon,
@RequestParam(value="lat", required = false) String lat,
@RequestParam(value="addr", required = false) String addr,
@RequestParam(value="gpsType", required = false) String gpsType,
@RequestParam(value="fileTime", required = false) String fileTime,
@RequestParam(value="fileInfo", required = false) String fileInfo,
@RequestParam(value="fileType", required = false) Integer fileType,
@RequestParam(value="fileTypeDesc", required = false) String fileTypeDesc,
@RequestParam(value="openId", required = false) String openId,
@RequestParam(value="jisName", required = false) String jisName,
@RequestParam(value="jisPhone", required = false) String jisPhone,
@RequestHeader("from-where") String fromWhere);
4.被调用方接收参数 文件的接收也一定要用 @RequestPart(value=“imgFile”, required = false) MultipartFile file
5.调用方的接口中 MultipartFile的接收可以用@RequestParam也可以用@RequestPart
6.注:调用方和feign还有被调用方三个地方的文件最好统一都用 MultipartFile