使用 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--
我是否需要手动构建请求正文,包括生成多部分边界?考虑到这个客户可以做的其他事情,这似乎有点过分了。
如果您已经在使用 Spring Web,您可以尝试我实现的能够创建多部分请求的 Feign 编码器。它可以发送单个文件、一组文件以及一个或多个额外的 JSON 有效负载。
这是我的 test project。如果不使用Spring,可以通过更改FeignSpringFormEncoder.
中的encodeRequest方法来重构代码
不,你不知道。你只需要定义一种代理接口方法,指定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 启动 2 和 spring-cloud-starter-openfeign 使用此代码:
@PostMapping(value="/upload", consumes = "multipart/form-data" )
QtiPackageBasicInfo upload(@RequestPart("package") MultipartFile package);
您需要在 feign 客户端调用中将 @RequestParam 更改为 @RequestPart 以使其正常工作,并将消耗添加到 @PostMapping。
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 添加答案:
为Feign-Form添加依赖:
io.github.openfeign.form
feign-form
3.8.0
将 FormEncoder 添加到您的 Feign.Builder,如下所示:
SomeApi github = Feign.builder()
.encoder(新的FormEncoder())
.target(SomeApi.class, "http://api.some.org");
- API端点
@RequestLine("POST /send_photo")
@Headers("Content-Type: multipart/form-data")
void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") FormData photo);
我正在尝试使用 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--
我是否需要手动构建请求正文,包括生成多部分边界?考虑到这个客户可以做的其他事情,这似乎有点过分了。
如果您已经在使用 Spring Web,您可以尝试我实现的能够创建多部分请求的 Feign 编码器。它可以发送单个文件、一组文件以及一个或多个额外的 JSON 有效负载。 这是我的 test project。如果不使用Spring,可以通过更改FeignSpringFormEncoder.
中的encodeRequest方法来重构代码不,你不知道。你只需要定义一种代理接口方法,指定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 启动 2 和 spring-cloud-starter-openfeign 使用此代码:
@PostMapping(value="/upload", consumes = "multipart/form-data" )
QtiPackageBasicInfo upload(@RequestPart("package") MultipartFile package);
您需要在 feign 客户端调用中将 @RequestParam 更改为 @RequestPart 以使其正常工作,并将消耗添加到 @PostMapping。
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 添加答案:
为Feign-Form添加依赖:
io.github.openfeign.form feign-form 3.8.0将 FormEncoder 添加到您的 Feign.Builder,如下所示:
SomeApi github = Feign.builder() .encoder(新的FormEncoder()) .target(SomeApi.class, "http://api.some.org");
- API端点
@RequestLine("POST /send_photo") @Headers("Content-Type: multipart/form-data") void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") FormData photo);