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
相关产品推荐
相关产品推荐

