You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无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请求:

  1. 定义Feign接口方法,接收RequestTemplate参数:
@RequestLine("POST /your-endpoint")
void uploadFiles(RequestTemplate template);
  1. 调用时手动添加各个请求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:32:40