使用Java响应式实现AWS S3分片文件上传遇415错误求助
415错误的可能原因及解决方法
415错误表示服务器不支持请求的媒体类型,结合你的代码和场景,主要有以下几个原因:
1. 注解使用错误
在Spring WebFlux中处理multipart/form-data请求时,不能用@RequestBody注解接收Flux<Part>。@RequestBody用于绑定原始请求体内容,而multipart请求需要专门的解析器来拆分并封装成Part对象,直接将Flux<Part>作为方法参数即可,无需添加@RequestBody。
修改后的代码:
@RequestMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, method = {RequestMethod.POST, RequestMethod.PUT}) public Mono<ResponseEntity<UploadResult>> multipartUploadHandler(@RequestHeader HttpHeaders headers, Flux<Part> parts) { return parts .ofType(FilePart.class) // 暂时忽略其他类型数据 .flatMap((part) -> saveFile(headers, s3config.getBucket(), part)) .collect(Collectors.toList()) .map((keys) -> ResponseEntity.status(HttpStatus.CREATED) .body(new UploadResult(HttpStatus.CREATED, keys))); }
2. 缺少Multipart解析器或依赖
如果是Spring Boot项目,确保已经引入spring-boot-starter-webflux依赖(WebFlux会自动配置Multipart解析器)。若手动配置了HttpMessageReader,可能覆盖了默认的Multipart解析器,导致无法处理multipart请求。
检查pom.xml(Maven):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
3. 请求的Content-Type不符合要求
确认请求的Content-Type必须是multipart/form-data且包含合法的boundary参数。比如使用Postman上传文件时,选择form-data格式后,工具会自动生成正确的Content-Type头;如果是自定义请求,需要手动指定boundary(通常由客户端生成,用于分隔不同的表单部分)。
内容的提问来源于stack exchange,提问作者Argun
相关产品推荐
相关产品推荐

