返回

全面剖析SpringMVC实现文件上传与下载的奥秘!

后端

SpringMVC文件上传与下载的全面指南

文件上传原理

在SpringMVC中,文件上传基于Servlet 3.0的MultipartRequest解析器。这个解析器将multipart/form-data类型的请求分解成多个部分,每个部分对应一个表单字段。

配置MultipartResolver

要启用SpringMVC中的文件上传,我们需要配置一个MultipartResolver。我们可以使用CommonsMultipartResolver,这是SpringMVC中默认的MultipartResolver实现。

<!-- 文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 上传文件大小限制10MB -->
    <property name="maxUploadSize" value="10485760"/>
    <!-- 单个文件大小限制2MB -->
    <property name="maxUploadSizePerFile" value="2097152"/>
</bean>

在控制器中接收文件

配置MultipartResolver后,我们可以在控制器中使用@RequestParam注解接收文件上传。

@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    // 保存文件
    file.transferTo(new File("/tmp/" + file.getOriginalFilename()));
    return "success";
}

文件下载实现

SpringMVC文件下载也很简单,我们只需要在控制器中使用@ResponseBody注解,并返回一个文件对象即可。

@GetMapping("/download")
@ResponseBody
public ResponseEntity<byte[]> download() {
    // 下载文件
    byte[] bytes = Files.readAllBytes(Paths.get("/tmp/test.txt"));
    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=test.txt")
            .body(bytes);
}

文件上传尺寸限制

SpringMVC默认的文件上传尺寸限制是10MB。我们可以通过设置CommonsMultipartResolver的maxUploadSize和maxUploadSizePerFile属性来修改这个限制。

<!-- 上传文件大小限制100MB -->
<property name="maxUploadSize" value="104857600"/>
<!-- 单个文件大小限制50MB -->
<property name="maxUploadSizePerFile" value="52428800"/>

文件上传编码方式

SpringMVC默认的文件上传编码方式是UTF-8。我们可以通过设置CommonsMultipartResolver的defaultEncoding属性来修改这个编码方式。

<!-- 上传文件默认编码方式 -->
<property name="defaultEncoding" value="GBK"/>

常见问题解答

  1. 如何配置多个文件上传?

答:我们可以使用MultipartHttpServletRequest接口接收多个文件上传。

@PostMapping("/upload")
public String upload(@RequestPart("files") List<MultipartFile> files) {
    // 保存文件
    for (MultipartFile file : files) {
        file.transferTo(new File("/tmp/" + file.getOriginalFilename()));
    }
    return "success";
}
  1. 如何处理文件上传异常?

答:我们可以使用CommonsMultipartResolver的handleFileUploadError方法处理文件上传异常。

try {
    multipartResolver.multipartRequest(request);
} catch (MultipartException e) {
    // 处理文件上传异常
}
  1. 如何限制文件类型?

答:我们可以使用CommonsMultipartResolver的setAllowedFileExtensions方法限制文件类型。

<!-- 限制允许的文件类型为图片 -->
<property name="allowedFileExtensions" value="jpg,png,gif"/>
  1. 如何禁用文件上传?

答:我们可以通过设置CommonsMultipartResolver的setMaxUploadSize为0来禁用文件上传。

<!-- 禁用文件上传 -->
<property name="maxUploadSize" value="0"/>
  1. 如何提高文件上传性能?

答:我们可以通过以下方式提高文件上传性能:

  • 使用高速存储设备
  • 优化网络连接
  • 调整服务器设置(例如,线程池大小、内存配置)