簡體   English   中英

使用 Feign 上傳文件 - multipart/form-data

[英]File Upload Using Feign - multipart/form-data

我正在嘗試使用 feign 完成多部分文件上傳,但我似乎無法在任何地方找到一個很好的例子。 我本質上希望 HTTP 請求結果類似於:

...
Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="name"

Larry
--AaB03x
   Content-Disposition: form-data; name="file"; filename="file1.txt"
   Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--

甚至...

------fGsKo01aQ1qXn2C
Content-Disposition: form-data; name="file"; filename="file.doc"
Content-Type: application/octet-stream

... binary data ...

------fGsKo01aQ1qXn2C--

我是否需要手動構建請求正文,包括生成多部分邊界? 考慮到這個客戶可以做的所有其他事情,這似乎有點過分。

不,你沒有。 你只需要定義一種代理接口方法,指定content-type為:multipart/form-data以及遠程API需要的參數等其他信息。 下面是一個例子:

public interface FileUploadResource {

    @RequestLine("POST /upload")
    @Headers("Content-Type: multipart/form-data")
    Response uploadFile(@Param("name") String name, @Param("file") File file);

} 

完整的示例可以在這里找到: File Uploading with Open Feign

對於 spring boot 2 和spring-cloud-starter-openfeign使用以下代碼:

@PostMapping(value="/upload", consumes = "multipart/form-data" )
QtiPackageBasicInfo upload(@RequestPart("package") MultipartFile package);

您需要在 feign 客戶端調用中將 @RequestParam 更改為 @RequestPart 以使其工作,並將消費添加到@PostMapping。

如果您已經在使用 Spring Web,您可以嘗試我實現的能夠創建 Multipart 請求的 Feign Encoder。 它可以發送單個文件、一組文件以及一個或多個額外的 JSON 有效負載。 這是我的測試項目 如果不使用Spring,可以通過改變FeignSpringFormEncoder中的encodeRequest方法來重構代碼。

MBozic 解決方案不完整,您還需要為此啟用編碼器:


public class FeignConfig {
     
    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

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

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

讓我為最新的 OpenFeign 添加答案:

  1. 為 Feign-Form 添加依賴:

    io.github.openfeign.form feign-form 3.8.0
  2. 像這樣將 FormEncoder 添加到您的 Feign.Builder 中:

SomeApi github = Feign.builder() .encoder(new FormEncoder()) .target(SomeApi.class, "http://api.some.org");

  1. API 端點

@RequestLine("POST /send_photo") @Headers("Content-Type: multipart/form-data") void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") FormData photo);

參考: https ://github.com/OpenFeign/feign-form

使用 feign 客戶端接口從一個服務調用另一個服務以進行文件傳輸/上傳/發送:

@FeignClient(name = "service-name", url = "${service.url}", configuration = FeignTokenForwarderConfiguration.class)

public interface UploadFeignClient {

@PostMapping(value = "upload", headers = "Content-Type= multipart/form-data", consumes = "multipart/form-data")
public void upload(@RequestPart MultipartFile file) throws IOException;

}

**Actual API:**

@RestController

@RequestMapping("upload")

public class UploadController {

@PostMapping(value = "/upload", consumes = { "multipart/form-data" })   
public void upload(@RequestParam MultipartFile file) throws IOException {

//implementation

}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM