使用Feign進行文件上傳

REST,Spring Cloud
Remote
0
07:30 AM · Dec 01 ,2025

1. 概述

在本教程中,我們將演示如何使用 Open Feign 上傳文件。Feign 是一種強大的工具,用於微服務開發人員以聲明方式通過 REST API 與其他微服務進行通信。

2. 先決條件

假設一個 RESTful Web 服務已暴露用於文件上傳,以下是詳細信息:

POST http://localhost:8081/upload-file

因此,為了解釋通過 Feign 客户端進行的文件上傳,我們將調用暴露的 Web 服務 API,如下所示:

@PostMapping(value = "/upload-file")
public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) {
    // 文件上傳邏輯
}

3. 依賴項

為了支持對文件上傳的 application/x-www-form-urlencodedmultipart/form-data 編碼類型,我們需要 feign-corefeign-form,以及 feign-form-spring 模塊。

因此,我們將向 Maven 添加以下依賴項:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-core</artifactId>
    <version>10.12</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>3.8.0</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form-spring</artifactId>
    <version>3.8.0</version>
</dependency>

我們還可以使用 spring-cloud-starter-openfeign,它內部包含 feign-core

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>3.1.0</version>
</dependency>

4. 配置

讓我們將 @EnableFeignClients 添加到我們的主類。 您可以訪問 spring cloud open feign 教程以獲取更多詳細信息:

@SpringBootApplication
@EnableFeignClients
public class ExampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }
}

@EnableFeignClients 註解允許對聲明為 Feign 客户端的接口進行組件掃描。

5. 文件上傳 via Feign 客户端

5.1. 通過註解的客户端

讓我們為註解的 @FeignClient 類創建所需的編碼器:

public class FeignSupportConfig {
    @Bean
    public Encoder multipartFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(new ObjectFactory<HttpMessageConverters>() {
            @Override
            public HttpMessageConverters getObject() throws BeansException {
                return new HttpMessageConverters(new RestTemplate().getMessageConverters());
            }
        }));
    }
}

注意,FeignSupportConfig 不需要使用 @Configuration 註解。

現在,讓我們創建一個接口並使用 @FeignClient 註解對其進行標註。 我們還將為“name”和“configuration”屬性添加其相應的值:

@FeignClient(name = "file", url = "http://localhost:8081", configuration = FeignSupportConfig.class)
public interface UploadClient {
    @PostMapping(value = "/upload-file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String fileUpload(@RequestPart(value = "file") MultipartFile file);
}

UploadClient 指向 先決條件 中提到的 API。

在與 Hystrix 交互時,我們將使用 fallback 屬性作為備用方案。 這在上傳 API 失敗時發生.

現在,我們的 @FeignClient 將如下所示:

@FeignClient(name = "file", url = "http://localhost:8081", fallback = UploadFallback.class, configuration = FeignSupportConfig.class)

最後,我們可以直接從服務層調用 UploadClient:

public String uploadFile(MultipartFile file) {
    return client.fileUpload(file);
}

5.2. 通過 Feign.builder

在某些情況下,我們的 Feign 客户端需要進行自定義,這在註解方式上,如上所述,是不可能的。 在這種情況下,我們使用 Feign.builder() API 創建客户端。

讓我們構建一個代理接口,其中包含一個針對文件上傳 REST API 的文件上傳方法:

public interface UploadResource {
    @RequestLine("POST /upload-file")
    @Headers("Content-Type: multipart/form-data")
    Response uploadFile(@Param("file") MultipartFile file);
}

@RequestLine 註解定義了 HTTP 方法和 API 的相對資源路徑,而 @Headers 則指定了諸如 Content-Type 這樣的標頭。

現在,讓我們在代理接口中調用指定的該方法。 我們將從我們的服務類中執行此操作:

public boolean uploadFileWithManualClient(MultipartFile file) {
    UploadResource fileUploadResource = Feign.builder().encoder(new SpringFormEncoder())
      .target(UploadResource.class, HTTP_FILE_UPLOAD_URL);
    Response response = fileUploadResource.uploadFile(file);
    return response.status() == 200;
}

在這裏,我們使用了 Feign.builder() 實用工具來構建 UploadResource 代理接口的實例。 我們還使用了 SpringFormEncoder 和基於 RESTful Web Service 的 URL。

6. 驗證

讓我們創建一個測試,以使用帶有註釋的客户端驗證文件上傳:

@SpringBootTest
public class OpenFeignFileUploadLiveTest {
    
    @Autowired
    private UploadService uploadService;
    
    private static String FILE_NAME = "fileupload.txt";
    
    @Test
    public void whenAnnotatedFeignClient_thenFileUploadSuccess() {
        ClassLoader classloader = Thread.currentThread().getContextClassLoader();
        File file = new File(classloader.getResource(FILE_NAME).getFile());
        Assert.assertTrue(file.exists());
        FileInputStream input = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain",
          IOUtils.toByteArray(input));
        String uploadFile = uploadService.uploadFile(multipartFile);

        Assert.assertNotNull(uploadFile);
    }
}

現在,讓我們創建一個其他的測試,以使用 Feign.Builder() 驗證文件上傳:

@Test
public void whenFeignBuilder_thenFileUploadSuccess() throws IOException {
    // 與上面相同
    Assert.assertTrue(uploadService.uploadFileWithManualClient(multipartFile));
}

7. 結論

在本文中,我們展示瞭如何使用 OpenFeign 實現 Multipart File 上傳,以及如何在簡單應用程序中包含它的各種方法。

我們還看到了如何配置 Feign 客户端或使用 Feign.Builder() 以執行相同的操作。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.