feign 传多个文件

controller

    @PostMapping("/upload")
    public List<?> uploadFiles(@RequestParam(value = "file") MultipartFile[] files, @RequestParam(value = "path") String path) {
        return null;
    }

feign

@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
List<?> uploadFiles(@RequestPart("file") MultipartFile[] file, @RequestPart("path") String path);

File或者路径 转成 MultipartFile

    public static MultipartFile getMultipartFile(File file) {
        FileInputStream fileInputStream;
        MultipartFile multipartFile = null;
        try {
            fileInputStream = new FileInputStream(file);
            multipartFile = new MockMultipartFile(file.getName(), file.getName(),
                    ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return multipartFile;
    }

 
    public static MultipartFile getMultipartFile(String filePath) {
        try {
            FileInputStream fileInputStream = new FileInputStream(filePath);
            return new MockMultipartFile(filePath, filePath,
                    ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

### 使用 Feign 输 MultipartFile 的解决方案 为了通过 Feign 客户端成功上传 `MultipartFile` 数据,需要完成以下几个方面的配置: #### 1. 配置支持 multipart/form-data 在使用 Feign 发送文件时,必须指定请求的内容类型为 `multipart/form-data`。这可以通过在接口方法中添加 `consumes = MediaType.MULTIPART_FORM_DATA_VALUE` 实现[^1]。 ```java @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) ResponseEntity<String> uploadFile(@RequestPart("file") MultipartFile file); ``` 在此示例中,`@RequestPart("file")` 注解用于绑定前端递的文件数据到 `MultipartFile` 参数上。这里的 `"file"` 是表单字段名称,可以根据实际需求自定义[^1]。 --- #### 2. 启用 Feign 对 multipart 的支持 默认情况下,Feign 并不支持 multipart 请求。因此,在声明 `@FeignClient` 接口时,需通过 `configuration` 属性引入一个多部分支持的配置类。通常的做法是创建一个名为 `FeignMultipartSupportConfig` 的 Bean,并将其注入到客户端中[^2]。 以下是具体的实现方式: ##### 创建配置类 ```java @Configuration public class FeignMultipartSupportConfig { @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(); } } ``` 此配置类中的 `SpringFormEncoder` 提供了对 multipart 表单的支持。 ##### 修改 Feign Client 声明 ```java @FeignClient(name = "fileUploadService", configuration = FeignMultipartSupportConfig.class, url = "http://example.com/api") public interface FileUploadClient { @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) ResponseEntity<String> uploadFile(@RequestPart("file") MultipartFile file); } ``` 在这里,`configuration` 属性指定了前面创建的 `FeignMultipartSupportConfig` 类,从而启用了 multipart 支持。 --- #### 3. 动态 IP 或 URL 的处理 如果目标服务的地址可能会发生变化,则可以在运行时动态设置 URL。一种常见的做法是在启动时加载配置中心的服务地址,或者通过程序逻辑更新 Feign 客户端的目标地址[^3]。 例如,假设我们有一个外部属性源来提供动态 URL: ```properties dynamic.url=http://new-service-address.com/api ``` 那么可以修改 Feign 客户端如下: ```java @FeignClient(name = "fileUploadService", configuration = FeignMultipartSupportConfig.class, url = "${dynamic.url}") public interface FileUploadClient { ... } ``` 这样就可以根据环境变量或其他配置动态调整目标服务器的位置[^3]。 --- #### 4. 测试代码片段 下面是一个完整的测试案例,展示如何调用上述 Feign 客户端并上传文件: ```java @SpringBootTest class FileUploadTest { @Autowired private FileUploadClient fileUploadClient; @Test void testFileUpload() throws IOException { FileSystemResource resource = new FileSystemResource(new File("/path/to/file.txt")); MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>(); formData.add("file", resource); ResponseEntity<String> response = fileUploadClient.uploadFile(resource.getFile()); System.out.println(response.getBody()); } } ``` 注意:这里使用的 `FileSystemResource` 来封装本地文件路径,也可以替换为其他类型的资源对象。 --- ### 总结 以上介绍了基于 Feign文件上传功能的核心要点,包括启用 multipart 支持、正确标注参数以及动态 URL 设置等内容。这些步骤能够帮助开发者快速构建起稳定可靠的文件上传机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值