Spring Reactive RestController转Kotlin协程时Multipart处理方案咨询
Spring Reactive Kotlin 协程 Multipart 请求处理方案
Spring Reactive 原生支持 Kotlin 响应式类型处理 Multipart 请求,最低兼容 Spring Framework 5.2+、Spring Boot 2.2+ 版本,配套官方提供的协程扩展能力即可直接使用 Flow 类型处理文件流。
改造代码示例
方案1:保留FilePart获取元数据,手动转Flow
如果需要获取文件名、Content-Type 等文件元数据,可保留参数类型为 FilePart,通过官方扩展方法直接转 Flow<DataBuffer> 处理:
@PostMapping(path = ["/{db}/manifest/{asset_id}"]) suspend fun pushManifest( @PathVariable(name = "db") db: String, @PathVariable(name = "asset_id") assetId: String, @RequestPart(name = "manifest") manifest: FilePart, @RequestPart(name = "head", required = false) head: FilePart? ): PushResult { // 直接将Reactor的Flux类型转为Kotlin原生Flow val manifestContent = manifest.content().asFlow() head?.let { val headContent = it.content().asFlow() // 自定义处理head文件流逻辑 } // 执行业务逻辑 return PushResult() }
方案2:直接声明参数为Flow类型
如果不需要文件元数据,可直接将 @RequestPart 参数声明为 Flow<DataBuffer> 类型,Spring 会自动完成类型适配:
@PostMapping(path = ["/{db}/manifest/{asset_id}"]) suspend fun pushManifest( @PathVariable(name = "db") db: String, @PathVariable(name = "asset_id") assetId: String, @RequestPart(name = "manifest") manifestContent: Flow<DataBuffer>, @RequestPart(name = "head", required = false) headContent: Flow<DataBuffer>? ): PushResult { manifestContent.collect { dataBuffer -> // 逐块处理文件内容 } // 执行业务逻辑 return PushResult() }
注意事项
- 需要引入
kotlinx-coroutines-reactor依赖,该包提供了 Reactor 和 Kotlin 响应式类型的互转扩展能力,使用 Spring Boot 版本管理的情况下无需指定版本号。 - 协程接口方法不需要返回
Mono包装类型,声明为suspend方法直接返回业务对象即可,Spring 会自动适配协程上下文处理请求响应流程。
内容的提问来源于stack exchange,提问作者Michael Burbidge
相关产品推荐
相关产品推荐

