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

Spring Kotlin文件上传报错:不支持application/octet-stream

Kotlin Spring上传PDF至MinIO时遭遇415媒体类型不支持错误

我正尝试用Kotlin Spring实现PDF文件上传至MinIO,编写了如下上传控制器:

@PostMapping(consumes = [MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_OCTET_STREAM_VALUE])
fun createPaper(
    @RequestPart("metadata") paperRequest: PaperRequest,
    @RequestPart("pdf") pdfFile: MultipartFile
): ResponseEntity<Paper>

我发起了如下curl请求:

$ curl -X POST http://localhost:8082/api/v1/papers -F "metadata={\"title\":\"Example Research Paper\",\"authors\":[\"Jane Smith\",\"John Doe\"],\"abstract\":\"This is a test paper abstract\",\"doi\":\"10.1234/test.123\",\"venue\":\"Test Conference 2024\",\"keywords\":[\"testing\",\"research\"]}" -F "pdf=@paper.pdf;type=application/pdf" -H "Content-Type: multipart/form-data"

但持续收到响应:

{"timestamp":"2025-01-07T09:14:36.910+00:00","status":415,"error":"Unsupported Media Type","path":"/api/v1/papers"}

Spring日志显示:

DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'application/octet-stream' is not supported]

我已尝试以下操作,但问题仍未解决:

  • 在控制器的consumes中添加MediaType.APPLICATION_OCTET_STREAM_VALUE
  • 在application.yaml中配置:
    mvc: 
      content-negotiation: 
        media-types: 
          octet-stream: application/octet-stream 
      servlet: 
        multipart: 
          enabled: true 
          max-file-size: 120MB 
          max-request-size: 120MB
    
  • 尝试通过Postman、HTML页面及curl发起请求

恳请技术帮助!


问题原因及解决方案

核心原因

你的控制器方法要求同时接收metadata和pdf两个@RequestPart,但curl请求中发送的metadata字段未指定正确的媒体类型,Spring默认将其识别为application/octet-stream,而控制器无法以该类型解析PaperRequest对象,从而抛出415错误。

具体修复步骤

  1. 修正curl请求,为metadata指定媒体类型
    在metadata表单字段后追加;type=application/json,明确告诉Spring该字段是JSON格式,可直接解析为PaperRequest:

    $ curl -X POST http://localhost:8082/api/v1/papers \
      -F "metadata={\"title\":\"Example Research Paper\",\"authors\":[\"Jane Smith\",\"John Doe\"],\"abstract\":\"This is a test paper abstract\",\"doi\":\"10.1234/test.123\",\"venue\":\"Test Conference 2024\",\"keywords\":[\"testing\",\"research\"]};type=application/json" \
      -F "pdf=@paper.pdf;type=application/pdf"
    

    注:无需手动设置Content-Type: multipart/form-data,curl会自动生成正确的多部分请求头。

  2. 调整控制器的consumes配置
    你的接口仅需处理multipart/form-data类型请求,无需添加application/octet-stream——该类型适用于单文件二进制流场景,和当前多部分表单请求不匹配:

    @PostMapping(consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
    fun createPaper(
        @RequestPart("metadata") paperRequest: PaperRequest,
        @RequestPart("pdf") pdfFile: MultipartFile
    ): ResponseEntity<Paper>
    
  3. 简化application.yaml配置
    当前问题与内容协商无关,可简化配置保留核心的multipart设置:

    spring:
      servlet:
        multipart:
          enabled: true
          max-file-size: 120MB
          max-request-size: 120MB
    

额外排查点

  • 确认PaperRequest类添加了正确的Jackson注解(如@Data、@NoArgsConstructor),确保Spring能正常解析JSON
  • 使用Postman测试时,需在form-data中将metadata的类型设置为raw→JSON,而非默认的Text

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:09:53