一. 导入相关 jar 包(若之前导入过 servlet-api 需排除)
<!--文件上传jar包, 前面已导过servlet-api需排除--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
二. 创建 upload.jsp
<html> <head> <title>Title</title> </head> <body> <form action="${pageContext.request.contextPath}/upload/test1" method="post" enctype="multipart/form-data"> file: <input type="file" name="source"><br> <input type="submit" value="上传"> </form> </body> </html>
三. 创建 UploadController.java
@Controller @RequestMapping("/upload") public class UploadController { @RequestMapping("/test1") //MultipartFile的值需与前端中file标签的name值相同, 以此获取前端上传的数据 public String test1(MultipartFile source, HttpSession session) throws IOException { System.out.println("test1"); //获取上传文件的 原始名称 String fileName = source.getOriginalFilename(); //获取上传文件的 类型 String contentType = source.getContentType(); //生成一个唯一的文件名, 防止提交的文件重名 String uniqueFileName = UUID.randomUUID().toString(); //获取文件后缀名 String ext = FilenameUtils.getExtension(fileName); //拼接成完整的唯一文件名, 用于接收文件 String uniqueFileName2 = uniqueFileName + "." + ext; System.out.println(uniqueFileName2); System.out.println(fileName); System.out.println(contentType); //返回该项目中参数目录的绝对路径 String realPath = session.getServletContext().getRealPath("/upload"); System.out.println("/upload目录的绝对路径: " + realPath); //保存文件 source.transferTo(new File(realPath + "\" + uniqueFileName2)); return "hello"; } }
四. 在 mvc.xml 中注册上传解析器(id固定为 multipartResolver)
... <!--上传解析器, id为multipartResolver--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> </beans>
五. 访问操作及验证
文件会保存到 target 的 upload 目录下, 为了让 upload 目录在项目部署时能正常部署过去, 不能让其为空, 比如在其中创建一个文件,
console 打印: