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错误。
具体修复步骤
修正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会自动生成正确的多部分请求头。调整控制器的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>简化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
相关产品推荐
相关产品推荐

