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

OpenAPI Generator生成Angular文件上传服务报415错误的解决问询

解决OpenAPI Generator生成Angular文件上传服务的415错误问题

版本信息

// package.json
"@openapitools/openapi-generator-cli": "2.11.0"
$ openapi-generator-cli version
5.3.0

问题现象

使用上述版本的openapi-generator-cli生成Java Spring Boot API对应的Angular服务,多数接口运行正常,但文件上传接口始终返回HTTP error 415 Unsupported Media Type。

Java Spring Boot端点代码

@PostMapping(value = "file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public void importFile(@RequestParam("file") MultipartFile file) {
    this.importController.importFile(file);
}

对应OpenAPI定义片段

"requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "required": ["file"],
                "type": "object",
                "properties": { "file": { "type": "string", "format": "binary" } }
              }
            }
          }
        },

生成的Angular服务代码问题

生成的importFile方法存在核心缺陷:

  • localVarUseForm始终为false,导致不会创建FormData实例,而是用HttpParams作为请求体(无法处理文件二进制数据)
  • 传入的文件参数未被添加到请求体中
  • 声明的consumes数组和canConsumeForm变量未被实际使用

代码片段:

public importFile(
    file: Blob,
    observe: any = 'body',
    reportProgress: boolean = false,
    options?: { httpHeaderAccept?: undefined; context?: HttpContext }
  ): Observable<any> {   
    // 省略HTTP Headers和HttpContext相关代码

    // 未被实际使用的变量
    const consumes: string[] = ['multipart/form-data'];
    const canConsumeForm = this.canConsumeForm(consumes);

    let localVarFormParams: { append(param: string, value: any): any };
    let localVarUseForm = false; // 始终为false
    let localVarConvertFormParamsToString = false; // 始终为false
    if (localVarUseForm) {
      localVarFormParams = new FormData();
    } else {
      // 始终执行此分支
      localVarFormParams = new HttpParams({ encoder: this.encoder });
    }

    // 省略响应类型相关代码

    return this.httpClient.post<any>(
      `${this.configuration.basePath}/api/priv/imports/file`,
      localVarConvertFormParamsToString ? localVarFormParams.toString() : localVarFormParams,
      {
        // 省略options配置
      }
    );
  }

手动调用可行方案

直接构造FormData发起请求可正常工作:

const formData: FormData = new FormData();
formData.append('file', file);
this.httpClient.post(`${this.configuration.basePath}/api/priv/imports/file`, formData)

但调用生成的服务时,即使传入FormData仍会触发415错误:

const formData: FormData = new FormData();
formData.append('file', file);
this.importResourceService.importFile(formData as any)

解决办法(无需手动修改生成代码)

1. 升级OpenAPI Generator版本

当前使用的5.3.0版本在处理multipart/form-data文件上传时存在bug,建议升级到6.0.0及以上版本,新版本修复了Angular客户端生成时的FormData处理逻辑,会正确识别multipart请求并生成符合要求的代码。

升级命令:

npm install @openapitools/openapi-generator-cli@latest --save-dev

2. 调整OpenAPI定义

若暂时无法升级版本,可修改OpenAPI定义,改用formData参数声明(适配旧版本生成器的兼容性):

"parameters": [
  {
    "name": "file",
    "in": "formData",
    "required": true,
    "type": "string",
    "format": "binary"
  }
],
"requestBody": {}

注意移除原有的requestBody配置,旧版本生成器会基于此定义生成正确的FormData处理代码。

3. 添加生成器配置参数

在生成代码时添加--additional-properties=useFormData=true参数,强制生成器为multipart请求使用FormData:

openapi-generator-cli generate -i your-openapi-spec.yaml -g typescript-angular -o ./src/app/api --additional-properties=useFormData=true

该参数会将生成代码中的localVarUseForm设为true,从而正确创建FormData并添加文件参数。

内容的提问来源于stack exchange,提问作者TCH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:05:09