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

Spring Cloud Gateway修改multipart/form-data请求体格式异常求助

问题分析与解决方案

问题根源

你当前的实现直接将原请求中的Part对象存入新的MultiValueMap,这会导致Spring Cloud Gateway将该Part序列化为嵌套的multipart子部分。原Part本身携带了原始的name="file"属性,最终请求体变成外层是name="document"的容器,内层保留原name="file"的文件结构,从而出现异常嵌套格式。

解决方案

需要创建新的Part对象,修改其Content-Disposition头中的name属性为document,同时保留原文件的内容、文件名、Content-Type等信息,而非直接复用原Part对象。

修改后的核心代码(Kotlin)

val modifiedRequest = serverRequest.bodyToMono(object : ParameterizedTypeReference<MultiValueMap<String, Part>>() {})
    .map { originalMap ->
        val newMap = LinkedMultiValueMap<String, Part>()
        originalMap["file"]?.firstOrNull()?.let { originalPart ->
            // 提取原文件的关键信息
            val filename = originalPart.filename()
            val contentType = originalPart.headers().contentType
            val contentBuffer = originalPart.content()

            // 构建新的Content-Disposition头
            val newDispositionBuilder = StringBuilder("form-data; name=\"document\"")
            filename?.let { newDispositionBuilder.append("; filename=\"$it\"") }
            val newDisposition = newDispositionBuilder.toString()

            // 自定义新Part对象,替换名称属性
            val newPart = object : Part {
                override fun headers(): HttpHeaders {
                    val headers = HttpHeaders()
                    headers.contentType = contentType
                    headers.set(HttpHeaders.CONTENT_DISPOSITION, newDisposition)
                    return headers
                }

                override fun content(): Flux<DataBuffer> = contentBuffer
                override fun filename(): String? = filename
                override fun name(): String = "document"
                override fun submit(): Mono<Void> = originalPart.submit()
                override fun delete(): Mono<Void> = originalPart.delete()
            }

            newMap["document"] = newPart
        }
        // 若原请求有其他表单字段,需在此处一并复制到newMap中
        newMap
    }

关键注意事项

  • 修改完成后,无需手动更新Content-Length,Spring Cloud Gateway会自动处理chunked编码或重新计算长度
  • 如果原请求包含其他非文件表单字段,需将这些字段也复制到新的MultiValueMap中,避免丢失参数
  • 测试时需验证文件内容完整性、文件名及Content-Type头是否正确传递

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:28:03