13

我正在尝试使用 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--

我是否需要手动构建请求正文,包括生成多部分边界?考虑到这个客户可以做的所有其他事情,这似乎有点过分。

4

5 回答 5

8

不,你没有。您只需要定义一种代理接口方法,指定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);

} 

完整的示例可以在这里找到:使用 Open Feign 上传文件

于 2017-01-11T02:42:12.387 回答
4

对于 spring boot 2 和spring-cloud-starter-openfeign使用以下代码:

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

您需要在 feign 客户端调用中将 @RequestParam 更改为 @RequestPart 以使其工作,并将消耗添加到 @PostMapping。

于 2019-11-08T16:15:09.063 回答
3

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);
}
于 2021-06-18T10:28:36.477 回答
1

如果您已经在使用 Spring Web,您可以尝试我的 Feign Encoder 实现,它能够创建 Multipart 请求。它可以发送单个文件、一组文件以及一个或多个额外的 JSON 有效负载。这是我的测试项目。如果不使用 Spring,可以通过更改 FeignSpringFormEncoder 中的 encodeRequest 方法来重构代码。

于 2016-02-21T19:42:09.153 回答
0

让我为最新的 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

于 2022-02-02T03:25:57.173 回答