如何在无Spring环境下用OpenFeign Client发送多文件?
如何在OpenFeign Client中实现任意数量文件的multipart/form-data上传?
我需要在multipart/form-data请求中发送任意数量的图片。参考OpenFeign的feign-form示例,单文件上传代码可正常运行:
// FormData parameter @RequestLine("POST /send_photo") @Headers("Content-Type: multipart/form-data") void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") FormData photo);
但将参数改为List<FormData>后无法成功上传文件。
注:无法控制服务端,但根据OpenAPI文档,服务端支持多文件上传,相关定义片段如下:
"requestBody": { "content": { "multipart/form-data": { "schema": { "required": [ "dto" ], "type": "object", "properties": { "dto": { "$ref": "#/components/schemas/MyTypeDto" }, "files": { "type": "array", "items": { "type": "string", "format": "binary" } } } } } } },
使用RestAssured时可通过多次调用addMultiPart("files", 文件对象)实现多文件上传,想知道在OpenFeign Client里怎么实现同样的效果。
解决方案
要在OpenFeign中实现多文件上传,不能直接用List<FormData>作为参数,推荐以下两种可行方式:
方式一:使用可变参数(最简单)
直接将文件参数定义为FormData的可变参数,feign-form会自动将它们解析为同名字段的多个请求part,完全匹配服务端的数组接收规则:
@RequestLine("POST /your-endpoint") @Headers("Content-Type: multipart/form-data") void uploadFiles(@Param("dto") MyTypeDto dto, @Param("files") FormData... files);
调用时直接传入多个FormData对象即可:
client.uploadFiles(dto, formData1, formData2, formData3);
方式二:手动构建请求体(适合动态文件数量)
如果文件数量是动态生成的,可以通过RequestTemplate手动组装multipart请求:
- 定义Feign接口方法,接收
RequestTemplate参数:
@RequestLine("POST /your-endpoint") void uploadFiles(RequestTemplate template);
- 调用时手动添加各个请求part:
// 初始化请求模板 RequestTemplate template = new RequestTemplate(); template.header("Content-Type", "multipart/form-data"); // 添加dto参数 template.form("dto", dto); // 循环添加所有文件 for (File file : fileList) { FormData formData = FormData.builder() .name("files") .content(new FileInputStream(file)) .fileName(file.getName()) .build(); template.form("files", formData); } // 执行上传 client.uploadFiles(template);
关键注意点
- feign-form对数组/可变参数类型的
FormData会自动处理为多个name="files"的请求part,和RestAssured多次调用addMultiPart的效果完全一致,刚好适配服务端的数组定义。 - 不要直接用
List<FormData>作为@Param参数,feign-form默认无法正确解析这种类型,会导致请求格式错误。
内容的提问来源于stack exchange,提问作者Mateusz Marchel
相关产品推荐
相关产品推荐

