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

Posted

技术标签:

【中文标题】使用 Feign 上传文件 - multipart/form-data【英文标题】:File Upload Using Feign - multipart/form-data 【发布时间】:2015-10-23 12:33:01 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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);

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于使用 Feign 上传文件 - multipart/form-data的主要内容,如果未能解决你的问题,请参考以下文章

已解决Feign上传文件相关配置

SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法

SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法

springboot~feign模拟multipart/form-data

[转]如何使用multipart/form-data格式上传文件

如何使用multipart/form-data格式上传文件