返回

Spring Boot集成Ajax文件上传时报错“Current request is not a multipart request”的解决方案

前端

Multipart 文件上传中的“当前请求不是 Multipart 请求”错误

简介

在使用 Spring Boot 集成 Ajax 进行文件上传时,可能会遇到一个常见的错误:“Current request is not a multipart request”。这个错误表明请求的 Content-Type 不是 multipart/form-data。让我们深入了解此错误的根源并探索解决方法。

错误的原因

Spring Boot 依赖于 MultipartResolver 组件来处理文件上传,而 MultipartResolver 仅支持 multipart/form-data 类型的请求。Multipart/form-data 是一个编码类型,它允许将文件和普通表单数据一起发送到服务器。如果请求没有使用正确的 Content-Type,MultipartResolver 将无法识别它,从而导致错误。

解决方法

要解决此错误,有三种方法:

  1. 修改表单的 Content-Type

在 HTML 表单中,使用 enctype="multipart/form-data" 属性来指定 Content-Type。

<form action="/upload" method="post" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit" value="上传">
</form>
  1. 使用 @RequestParam 接收 MultipartFile

在 Spring Boot 控制器中,使用 @RequestParam MultipartFile 接收文件。

@PostMapping("/upload")
public String upload(@RequestParam MultipartFile file) {
  // 处理上传的文件
  return "redirect:/success";
}
  1. 配置 MultipartResolver

在 Spring Boot 配置文件中,配置一个 MultipartResolver bean。

@Bean
public MultipartResolver multipartResolver() {
  CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
  multipartResolver.setMaxUploadSize(1024 * 1024 * 10); // 限制上传文件的大小为 10MB
  return multipartResolver;
}

注意事项

  • 对于 Spring Boot 2.0 及更高版本,需要在 pom.xml 中添加 spring-boot-starter-web 依赖项。
  • 对于 Spring Boot 1.5 及更低版本,需要添加 spring-webmvc 依赖项。
  • 可以通过配置 spring.servlet.multipart.max-file-size 或 spring.http.multipart.max-file-size 属性来限制上传文件的大小。

结论

解决“Current request is not a multipart request”错误涉及修改表单的 Content-Type、使用 @RequestParam 接收 MultipartFile 或配置 MultipartResolver。通过遵循这些步骤,可以轻松解决此问题并成功上传文件。

常见问题解答

  1. 为什么必须使用 multipart/form-data Content-Type?

multipart/form-data Content-Type 允许同时发送文件和表单数据。它将请求主体划分为多个部分,每个部分包含一个文件或一个表单字段。

  1. 如何限制上传文件的大小?

通过配置 CommonsMultipartResolver 的 maxUploadSize 属性或在配置文件中设置 spring.servlet.multipart.max-file-size 属性来限制上传文件的大小。

  1. 什么是 MultipartResolver?

MultipartResolver 是一个组件,负责处理 multipart/form-data 请求并从中提取文件和表单数据。

  1. 如何配置 MultipartResolver?

在 Spring Boot 配置文件中配置一个 CommonsMultipartResolver bean 并设置其 maxUploadSize 属性。

  1. 文件上传的最佳实践是什么?
  • 使用 multipart/form-data Content-Type。
  • 使用 @RequestParam 接收 MultipartFile。
  • 限制上传文件的大小。
  • 验证上传文件的类型和大小。