Spring MVC 文件上传
Spring MVC 为文件上传提供了直接支持,这种支持是通过即插即用的 MultipartResolver 实现的。Spring 使用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类:CommonsMultipartResolver。
在 Spring MVC 上下文中默认没有装配 MultipartResolver,因此默认情况下不能处理文件的上传工作。如果想使用 Spring 的文件上传功能,则需要先在上下文中配置 MultipartResolver。
1.配置 MultipartResolver
下面使用 CommonsMultipartResolver 配置一个 MultipartResolver 解析器。
<!-- 文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8"//①请求的编码格式,默认为ISO-8859-1 p:maxUploadSize="5000000"//②上传文件的大小上限,单位为字节(5MB) p:uploadTempDir="file://d:/temp"/>//③上传文件的临时路径
defaultEncoding 必须和用户 JSP 的 pageEncoding 属性一致,以便正确读取表单的内容。uploadTempDir 是文件上传过程中所使用的临时目录,文件上传完成后,临时目录中的临时文件会被自动清除。
为了让 CommonsMultipartResolver 正常工作,必须先将 Jakarta Commons FileUpload 及 Jakarta Commons io 的类包添加到类路径下。
2.编写控制器和文件上传表单页面
在 UserController 中添加一个用于处理用户头像上传的方法,如下面代码所示。
@Controller @RequestMapping("/user") public class UserController { @RequestMapping(value = "/uploadPage")//① public String updatePage() { return "uploadPage"; } @RequestMapping(value = "/upload") public String updateThumb(@RequestParam("name") String name, @RequestParam("file") MultipartFile file) throws Exception{ //②上传的文件自动绑定到MultipartFile中 if (!file.isEmpty()) { file.transferTo(new File("d:/temp/"+file.getOriginalFilename())); return "redirect:success.html"; }else{ return "redirect:fail.html"; } } }
Spring MVC 会将上传文件绑定到 MultipartFile 对象中。MultipartFile 提供了获取上传文件内容、文件名等方法,通过其 transferTo() 方法还可将文件存储到硬件中,具体说明如下。
- byte[] getBytes():获取文件数据。
- String getContentType():获取文件 MIME 类型,如 image/pjpeg、text/plain 等。
- InputStream getInputStream():获取文件流。
- String getName():获取表单中文件组件的名字。
- String getOriginalFilename():获取上传文件的原名。
- long getSize():获取文件的字节大小,单位为 Byte.
- boolean isEmpty():是否有上传的文件。
- void transferTo(File dest):可以使用该文件将上传文件保存到一个目标文件中。
负责上传文件的表单和一般表单有一些区别,表单的编码类型必须是 multipart/form-data 类型。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>请上传用户头像</title> </head> <body> <h1> 请选择上传的头像文件 </h1> <form method="post" action="<c:url value="/user/upload.html"/>" enctype="multipart/form-data">//指定表单内容类型,以便支持文件上传 <input type="text" name="name" /> <input type="file" name="file" />//②上传文件的组件名 <input type="submit" /> </form> </body> </html>