Spring MVC,文件上传
本文引用自:《Java EE企业级应用开发教程》
通常情况下,文件上传都是通过表单形式提交给后台服务器;表单必须满足3个条件:
- 表单的method属性设置为post
- 表单的enctype属性设置为multipart/form-data
- 提供类似于<input id="file" type="file" name="uploadfile" multiple="multiple" />的文件上传输入框
其中,input元素的multiple是HTML5的新属性,允许用户选择多个文件进行上传。
Spring MVC为文件上传提供支持,这种支持通过MultipartResolver接口的实现类CommonsMultipartResolver完成。需要在配置文件中定义MultipartResolver接口的Bean,此处配置同样可以决定文件编码格式和上传文件的最大值(属性:defaultEncoding、maxUploadSize)。
CommonsMultipartResolver是Spring MVC内部通过Apache Commons FileUpload技术实现,所以Spring MVC的文件上传需要依赖Apache Commons FileUpload组件。
步骤一、导入依赖包,修改Maven的pom.xml
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
步骤二、在web.xml中,配置Spring MVC的前端控制器信息
具体参考:Spring MVC,基于注解的Spring MVC应用
步骤三、修改springmvc-config.xml,增加如下代码:
<!-- 配置文件上传解析器 MultipartResolver --> <bean id="multipartResolver" class= "org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置请求编码格式--> <property name="defaultEncoding" value="UTF-8" /> </bean>
步骤四、创建文件上传页面fileUpload.jsp,位于WebContent根目录
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上传</title> <script> // 判断是否填写上传人并已选择上传文件 function check(){ var name = document.getElementById("name").value; var file = document.getElementById("file").value; if(name==""){ alert("填写上传人"); return false; } if(file.length==0||file==""){ alert("请选择上传文件"); return false; } return true; } </script> </head> <body> <form action="${pageContext.request.contextPath }/fileUpload" method="post" enctype="multipart/form-data" onsubmit="return check()"> 上传人:<input id="name" type="text" name="name" /><br /> 请选择文件:<input id="file" type="file" name="uploadfile" multiple="multiple" /><br /> <input type="submit" value="上传" /> </form> </body> </html>
注意:只有填写了上传人,并且选择需要上传的文件后,才能正常提交表单
步骤五、在WEB-INF/jsp目录中,创建uploadSuccess.jsp/uploadError.jsp
uploadSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 文件上传成功! </body> </html>
uploadError.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 文件上传失败,请重新上传! </body> </html>
步骤六、创建控制器类
package com.itheima.controller; import java.io.File; import java.net.URLEncoder; import java.util.List; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; /** * 文件上传 */ @Controller public class FileUploadController { /** * 执行文件上传 */ @RequestMapping("/fileUpload") public String handleFormUpload(@RequestParam("name") String name, @RequestParam("uploadfile") List<MultipartFile> uploadfile, HttpServletRequest request) { // 判断所上传文件是否存在 if (!uploadfile.isEmpty() && uploadfile.size() > 0) { //循环输出上传的文件 for (MultipartFile file : uploadfile) { // 获取上传文件的原始名称 String originalFilename = file.getOriginalFilename(); // 设置上传文件的保存地址目录 String dirPath = request.getServletContext().getRealPath("/upload/"); File filePath = new File(dirPath); // 如果保存文件的地址不存在,就先创建目录 if (!filePath.exists()) { filePath.mkdirs(); } // 使用UUID重新命名上传的文件名称(上传人_uuid_原始文件名称) String newFilename = name+ "_"+UUID.randomUUID() + "_"+originalFilename; try { // 使用MultipartFile接口的方法完成文件上传到指定位置 file.transferTo(new File(dirPath + newFilename)); } catch (Exception e) { e.printStackTrace(); return"error"; } } // 跳转到成功页面 return "uploadSuccess"; }else{ return"uploadError"; } } }
步骤七、测试,打开页面:http://localhost:8080/ssm/fileUpload.jsp
输入上传人,选择文件,提交,文件将存放于WebContent/upload目录之下。