OpenAPI生成多文件上传代码:InputProvider转MultipartFile及S3上传问题
OpenAPI Kotlin生成器处理Multipart文件上传问题解决方案
一、替代字段定义方案(解决string类型导致的服务端字段名混乱)
之前用object(format: binary)是因为string类型会导致字段名混乱,其实可以通过调整OpenAPI规范和生成器参数解决:
- 回归
type: string+format: binary的标准定义,同时给服务端生成器加参数:
用kotlin-spring生成时,添加--additional-properties modelPropertyNaming=original,强制保留原始字段名,避免生成器自动转驼峰/下划线导致的混乱。如果是Spring Boot 3环境,再加useSpringBoot3=true,useJakartaEe=true适配新的API。 - 要是还不行,直接在字段里加
x-field-name扩展属性硬指定服务端接收的字段名:file1: type: string format: binary x-field-name: file1
二、服务端从InputProvider提取文件上传到S3
InputProvider是Ktor的输入流封装,直接拆出来用就行:
- 先把InputProvider转成标准输入流:
val fileStream = inputProvider.provideInput().toInputStream() - 用AWS SDK v2上传到S3的示例代码:
val s3Client = S3Client.builder().region(Region.US_EAST_1).build() val uploadRequest = PutObjectRequest.builder() .bucket("你的存储桶名称") .key("存储到S3的文件名,比如file1.pdf") .build() // 用输入流构造请求体,size直接取InputProvider的size就行 s3Client.putObject(uploadRequest, RequestBody.fromInputStream(fileStream, inputProvider.size ?: -1)) - 注意:如果InputProvider的size是null,要么先把文件临时存到本地,要么用S3的分段上传,不过一般客户端都会传文件大小。
三、客户端生成阶段强制用MultipartFile类型
要让生成器直接产出MultipartFile类型的参数,分两步:
- 在OpenAPI规范里给文件字段加
x-kotlin-type扩展,指定类型:file1: type: string format: binary x-kotlin-type: org.springframework.web.multipart.MultipartFile - 生成客户端时,给
kotlin生成器加参数:
用--additional-properties library=spring,让生成器基于Spring生态生成代码,自动适配MultipartFile。要是用的Spring Boot 3,再加useSpringBoot3=true。
如果以上配置不好使,还有个临时办法:手动改生成的客户端代码,把InputProvider替换成MultipartFile,然后写个扩展方法转成Ktor需要的InputProvider:
fun MultipartFile.toInputProvider(): InputProvider { return InputProvider { ByteReadChannel(this.inputStream) }.apply { size = this@toInputProvider.size } }
内容的提问来源于stack exchange,提问作者Manikdn84
相关产品推荐
相关产品推荐

