Content type 'multipart/form-data;boundary=-....Ndzc1;charset=UTF-8' not supported

本文介绍在SpringBoot项目中,使用@ControllerRestful注解处理multipart/form-data类型请求时遇到的HttpMediaTypeNotSupportedException异常。通过调整AdmingoodsController中的接口参数接收方式,即移除@RequestBody注解,成功解决了问题。文章探讨了可能的原因,并为类似问题提供了解决方案。
org.springframework.web.HttpMediaTypeNotSupportedException: 
Content type 'multipart/form-data;boundary=----WebKitFormBoundaryRAYPKeHKTYSNdzc1;charset=UTF-8' not supported
背景: springboot工程一个controller接口
@RestController
@RequestMapping("/admin/product/admingoods")
@Api(description = "商品接口")
@CrossOrigin
@Slf4j
public class AdmingoodsController {
	 @ApiOperation(value = "新增商品")  //表单提交,有文本有图片,数据都封装在Admingoods 实体类中
	 @PostMapping("/add")
	 public R save(@ApiParam(name = "admingoods", value = "商品对象", required = true) 
	 @RequestBody Admingoods admingoods) {
	   // do business
	}
}

当参数@RequestBody Admingoods admingoods加了@RequestBody时测试请求的时候就会报上面的错误
解决方法:将参数前面的@RequestBody去掉即可正常请求,具体原因有待研究...
<think> 我们正在处理一个关于Spring Boot中上传文件时出现的错误:“Content type 'multipart/form-data;charset=UTF-8' not supported”。根据引用[1]和[2],错误信息显示Spring Boot不支持给定的Content-Type。引用[3]指出,@RequestParam注解用于接收请求url?后面的参数,或者Content-Type为multipart/form-data、application/x-www-form-urlencoded时的http body数据。 问题分析: 通常,这个错误发生在使用Spring Boot处理文件上传时,可能的原因有: 1. 在控制器方法中,使用@RequestParam来接收文件,但没有正确配置multipart解析器。 2. 请求的Content-Type虽然为multipart/form-data,但可能因为某些配置问题导致Spring无法解析。 解决方案: 步骤1:添加必要的依赖(如果使用Maven) 确保在pom.xml中包含了spring-boot-starter-web依赖,它已经包含了处理multipart请求的库。但如果你需要额外的配置,可以添加commons-fileupload依赖(不过Spring Boot默认使用Servlet 3.0的multipart支持,所以通常不需要)。 步骤2:配置multipart属性(可选) 在application.properties或application.yml中配置multipart相关属性,例如: ```properties spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` 步骤3:检查控制器方法 确保在控制器方法中,使用@RequestParam("file") MultipartFile file来接收文件,并且方法使用@PostMapping注解,同时确保请求的Content-Type为multipart/form-data。 但是,根据引用[3],这个错误可能是因为使用了@RequestParam注解,但请求的Content-Type并不是它能够处理的。实际上,对于multipart/form-data请求,Spring MVC要求使用MultipartFile类型来接收文件。 步骤4:如果使用@RequestParam注解,确保参数名与前端表单中的文件字段名一致。 步骤5:如果以上步骤都正确,那么可能是Spring的multipart解析器没有正确配置。在Spring Boot中,默认是启用的。但是,如果自定义了MultipartResolver,需要确保bean的名字为"multipartResolver"(因为Spring MVC会按这个名字查找)。例如: ```java @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); // 设置一些属性 return resolver; } ``` 注意:这里返回的bean名称必须是multipartResolver(方法名也是multipartResolver),否则Spring MVC会使用默认的解析器。 步骤6:如果使用的是Servlet 3.0容器(如Tomcat),还可以尝试在启动类上添加@EnableWebMvc注解,但Spring Boot会自动配置,所以通常不需要。 另一种可能:如果请求中包含了JSON数据和其他类型的混合,可能需要使用@RequestPart代替@RequestParam。但是,对于普通的文件上传,@RequestParam就足够了。 根据错误信息,我们看到boundary字符串和charset=UTF-8,这是multipart请求的正常格式。因此,问题可能在于Spring Boot没有正确解析这个请求,可能是因为没有配置multipart解析器,或者配置有误。 但是,在Spring Boot中,默认已经配置了MultipartAutoConfiguration,所以通常不需要额外配置。所以,重点检查控制器的参数注解和类型。 如果问题仍然存在,请检查是否在控制器方法上错误地使用了consumes属性,比如: ```java @PostMapping(value = "/upload", consumes = MediaType.APPLICATION_JSON_VALUE) ``` 这样会限制只接收JSON请求,而文件上传的请求是multipart/form-data,所以会导致不支持的媒体类型错误。 因此,确保consumes属性没有限制为其他类型,或者不指定consumes属性(默认可接受所有类型)。 总结步骤: 1. 检查依赖:确保有spring-boot-starter-web。 2. 检查配置:在application.properties中配置multipart(可选,但建议设置大小限制)。 3. 检查控制器:使用MultipartFile和@RequestParam,且参数名匹配,不要使用consumes限制为其他类型。 4. 避免自定义MultipartResolver,或者确保自定义的bean名称为multipartResolver。 如果按照以上步骤,问题应该可以解决。 下面我们生成相关问题: </think> ### 解决 "Content type 'multipart/form-data;charset=UTF-8' not supported" 错误的方法 该错误通常发生在 Spring Boot 应用中处理文件上传时,主要原因是控制器未能正确解析 multipart/form-data 类型的请求。以下是详细解决方案: #### 1. **检查控制器参数注解** [^3] ```java // 错误用法:@RequestParam 不能直接接收 multipart 请求体 @PostMapping("/upload") public String upload(@RequestParam String file) { ... } // 正确用法:使用 @RequestPart 接收文件 @PostMapping("/upload") public String upload(@RequestPart("file") MultipartFile file) { ... } ``` `@RequestParam` 仅适用于 URL 参数或 `application/x-www-form-urlencoded` 数据,**必须改用 `@RequestPart` 或 `@RequestParam` 配合 `MultipartFile` 类型**接收文件。 #### 2. **验证依赖配置** [^2] 确保 `pom.xml` 包含必要的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` Spring Boot 2.x+ 已内置 multipart 处理功能,无需额外添加 `commons-fileupload`。 #### 3. **配置 Multipart 属性** (application.properties) ```properties # 启用 multipart 处理 spring.servlet.multipart.enabled=true # 设置最大文件大小(根据需求调整) spring.servlet.multipart.max-file-size=10MB # 设置最大请求大小 spring.servlet.multipart.max-request-size=10MB # 明确指定字符集(可选) spring.servlet.multipart.resolver-charset=UTF-8 ``` #### 4. **检查请求头格式** [^1] 前端请求头需严格符合规范: ```http // 正确的请求头示例 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123 ``` 确保: - 包含有效的 `boundary` 参数 - 不要手动添加 `charset=UTF-8`(Spring 会自动处理) #### 5. **自定义 MultipartResolver** (可选) 在配置类中添加: ```java @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("UTF-8"); resolver.setMaxUploadSize(10 * 1024 * 1024); // 10MB return resolver; } ``` #### 6. **验证客户端代码** 前端上传示例(使用 Fetch API): ```javascript const formData = new FormData(); formData.append("file", fileInput.files[0]); // 不要手动设置 Content-Type 头部! fetch('/upload', { method: 'POST', body: formData // 浏览器会自动生成正确头部 }); ``` > **关键点总结**: > - 使用 `@RequestPart` 或 `MultipartFile` 接收文件 > - 避免手动设置请求头中的 `charset` > - 确保依赖和属性配置正确 > - 客户端让浏览器自动生成 `Content-Type` 头部
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值