使用 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的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法
SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法
springboot~feign模拟multipart/form-data