feign传输文件

时间:2025-04-11 17:25:44

一、对于单个文件上传

@RequestMapping(method = ,consumes = MediaType.MULTIPART_FORM_DATA_VALUE,value = "/file/upload")
ResponseVO<UploadFileVO> upload(@RequestPart MultipartFile picFile,@RequestParam Integer count,@RequestParam String type,@RequestParam String service);


File image1 = new File(imagePath1);
MockMultipartFile imageMultiFile1 = new MockMultipartFile((),new FileInputStream(image1));
ResponseVO<UploadFileVO> imageResponse1 = (imageMultiFile1,1,"file","upload");

@RequestPart主要用来处理content-type为 multipart/form-data 或 multipart/mixed stream 发起的请求,可以获取请求中的参数,包括普通文本、文件或复杂对象比如json、xml等,针对json等复杂对象。

@RequestParam也同样支持multipart/form-data请求,@RequestParam适用于name-value String类型的请求,@RequestPart适用于复杂的请求域(像JSON,XML)

上例中的@RequestParam参数可以通过以下方法获取

String type = ("type");

二、对于多个文件上传

2.1、多文件编码解析,重写encode方法,处理多文件

import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

import ;
import ;
import ;
import ;

/**
 * @Author: nzy
 * @Description:
 * @Date:Create:in 2022/8/5 10:27
 * @Modified By:
 */
public class SpringMultipartEncoder extends SpringFormEncoder {

    public SpringMultipartEncoder() {
        this(new Default());
    }

    public SpringMultipartEncoder(Encoder delegate) {
        super(delegate);
        MultipartFormContentProcessor processor = (MultipartFormContentProcessor) getContentProcessor();
        (new SpringSingleMultipartFileWriter());
        (new SpringManyMultipartFilesWriter());
    }

    @Override
    public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
        if (bodyType != null && ()) {
            MultipartFile file = (MultipartFile) object;
            if (file != null) {
                Map<String, Object> data = ((), object);
                (data, MAP_STRING_WILDCARD, template);
                return;
            }
        } else if (bodyType != null && (MultipartFile[].class)) {
            if(object!=null) {
                MultipartFile[] files = (MultipartFile[]) ((MultipartFile[]) object);
                Map<String, MultipartFile> data = new HashMap<>();
                for(int i=1;i<=;i++) {
                    ("file"+i,files[i-1]);
                }
                (data, MAP_STRING_WILDCARD, template);
                return;
            }
        }
        (object, bodyType, template);
    }
}

  2.2、config配置文件

import ;
import ;
import ;
import ;
import ;
import ;
import ;

/**
 * @Author: nzy
 * @Description:
 * @Date:Create:in 2022/8/5 10:27
 * @Modified By:
 */
@Configurable
public class MultipartSupportConfig {

    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

    @Bean
    public Encoder feignFormEncoder() {
        return new SpringMultipartEncoder(new SpringEncoder(messageConverters));
    }
}

 2.3、在feignclient上配置configuration 属性为自定义的Encoder,这个config仅影响设置的feign

@FeignClient(value="${}",fallback = ,contextId = "dormClient",configuration = )
public interface FileClient {
    @RequestMapping(method = ,consumes = MediaType.MULTIPART_FORM_DATA_VALUE,value = "/file/upload")
    ResponseVO<UploadFileVO> upload(@RequestPart MultipartFile[] picFile,@RequestParam Integer count,@RequestParam String type,@RequestParam String service);
}

2.4、使用

        MockMultipartFile imageMultiFile1 = new MockMultipartFile((),(),null,new FileInputStream(image1));
        MockMultipartFile imageMultiFile2 = new MockMultipartFile((),(),null,new FileInputStream(image2));
        MockMultipartFile multiFile1 = new MockMultipartFile((),(),null,new FileInputStream(file1));
        MockMultipartFile multiFile2 = new MockMultipartFile((),(),null,new FileInputStream(file2));

        MockMultipartFile[] mockMultipartFiles = new MockMultipartFile[]{imageMultiFile1,imageMultiFile2,multiFile1,multiFile2};
        ResponseVO<UploadFileVO> fileResponse = (mockMultipartFiles,4,"file","upload");
        ("文件上传结果:{}",fileResponse);

2.5、file接收文件服务:

@RestController
@RequestMapping(value = "/file")
@Slf4j
public class UploadFileController {
    @PostMapping(value = "/upload")
    public ResponseVO<UploadFileVO> upload(HttpServletRequest request) {
        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
        String type = ("type");
        Integer count =  ("count");
        for(int i=1;i<=count;i++) {
            MultipartFile mf = ("file" + i);
        }
    }

}