目录
项目结构

1.配置web.xml
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
- http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
- <display-name>Archetype Created Web Applicationdisplay-name>
-
-
- <filter>
- <filter-name>encFilterfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
- <init-param>
- <param-name>encodingparam-name>
- <param-value>utf-8param-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>encFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
-
-
- <filter>
- <filter-name>httpMethodFilterfilter-name>
- <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
- filter>
- <filter-mapping>
- <filter-name>httpMethodFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
-
-
- <servlet>
- <servlet-name>dispatcherServletservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
- <init-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
- <load-on-startup>1load-on-startup>
- servlet>
- <servlet-mapping>
- <servlet-name>dispatcherServletservlet-name>
- <url-pattern>/url-pattern>
- servlet-mapping>
- web-app>
2.引入依赖
- <dependencies>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>5.2.12.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webartifactId>
- <version>5.2.12.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>5.2.12.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>servlet-apiartifactId>
- <version>2.5version>
- <scope>providedscope>
- dependency>
-
- <dependency>
- <groupId>javax.servlet.jspgroupId>
- <artifactId>jsp-apiartifactId>
- <version>2.0version>
- <scope>providedscope>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-coreartifactId>
- <version>2.9.0version>
- dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>2.9.0version>
- dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-annotationsartifactId>
- <version>2.9.0version>
- dependency>
-
-
- <dependency>
- <groupId>commons-fileuploadgroupId>
- <artifactId>commons-fileuploadartifactId>
- <version>1.3.1version>
- dependency>
- <dependency>
- <groupId>commons-iogroupId>
- <artifactId>commons-ioartifactId>
- <version>2.4version>
- dependency>
-
-
- <dependency>
- <groupId>com.sun.jerseygroupId>
- <artifactId>jersey-coreartifactId>
- <version>1.18.1version>
- dependency>
- <dependency>
- <groupId>com.sun.jerseygroupId>
- <artifactId>jersey-clientartifactId>
- <version>1.18.1version>
- dependency>
-
-
- <dependency>
- <groupId>org.apache.taglibsgroupId>
- <artifactId>taglibs-standard-specartifactId>
- <version>1.2.5version>
- dependency>
- <dependency>
- <groupId>org.apache.taglibsgroupId>
- <artifactId>taglibs-standard-implartifactId>
- <version>1.2.5version>
- dependency>
- dependencies>
-
- <build>
- <plugins>
-
- <plugin>
- <groupId>org.apache.tomcat.mavengroupId>
- <artifactId>tomcat7-maven-pluginartifactId>
- <version>2.1version>
- <configuration>
- <port>8080port>
- <path>/path>
- <uriEncoding>UTF-8uriEncoding>
- <server>tomcat7server>
- <systemProperties>
- <java.util.logging.SimpleFormatter.format>%1$tH:%1$tM:%1$tS %2$s%n%4$s: %5$s%6$s%n java.util.logging.SimpleFormatter.format>
- systemProperties>
- configuration>
- plugin>
- plugins>
- build>
3.在配置文件springmvc.xml中配置相关配置
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation=" http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd">
-
- <context:component-scan base-package="com.itbaizhan">context:component-scan>
-
-
- <mvc:annotation-driven >mvc:annotation-driven>
-
-
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-
- <property name="prefix" value="/" />
-
- <property name="suffix" value=".jsp" />
- bean>
-
-
- <mvc:default-servlet-handler />
-
-
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
-
- <property name="maxUploadSize" value="104857600">property>
-
- <property name="defaultEncoding" value="uft-8">property>
- bean>
- beans>
二、SpringMVC上传_原生方式上传
上传是Web工程中很常见的功能,SpringMVC框架简化了文件上传的代码,我们首先使用JAVAEE原生方式上传文件:
1.创建新的SpringMVC项目(Maven-webapp),在web.xml中将项目从2.3改为3.1,即可默认开启el表达式
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> web-app>2.编写上传表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上传title> head> <body> <h3>文件上传h3> <%-- 上传表单的提交方式必须是post,get方式没有请求体,提交的数据较少,而上传文件的数据量大,所以使用post提交 --%> <%-- enctype属性为multipart/form-data,意思是不对表单数据进行编码,在使用包含文件上传控件的表单时,必须使用该值 --%> <form action="/fileUpload" method="post" enctype="multipart/form-data"> <%-- 文件选择控件,类型是file,必须要有name属性--%> 选择文件:<input type="file" name="upload"> <input type="submit" value="上传"> form> body> html>3.编写控制器接收上传请求,控制器进行三步操作:
(1)创建文件夹,存放上传文件。
(2)分析请求体,找到上传文件数据。
(3)将文件数据写入文件夹。
@RequestMapping("/fileUpload") public String upload(HttpServletRequest request) throws Exception { // 创建文件夹,存放上传文件 // 1.设置上传文件夹的真实路径 String realPath = request.getSession().getServletContext().getRealPath("/upload"); // 2.判断该目录是否存在,如果不存在,创建该目录 File file = new File(realPath); if(!file.exists()){ file.mkdirs(); } // 分析请求体,找到上传文件数据 // 1.创建磁盘文件工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 2.创建上传数据分析器对象 ServletFileUpload servletFileUpload = new ServletFileUpload(factory); // 3.利用分析器对象解析请求体,返回所有数据项 ListfileItems = servletFileUpload.parseRequest(request); // 4.遍历所有数据,找到文件项(非表单项) for (FileItem fileItem:fileItems){ if(!fileItem.isFormField()){ // 将文件数据写入文件夹 // 1.获取文件名 String name = fileItem.getName(); // 2.将文件写入磁盘 fileItem.write(new File(file,name)); // 3.删除内存中的临时文件 fileItem.delete(); } } return "index"; }4.请求路径:localhost:8080/upload.jsp
三、SpringMVC上传_SpringMVC方式上传
SpringMVC使用框架提供的文件解析器对象,可以直接将请求体中的文件数据转为MultipartFile对象,从而省略原生上传中分析请求体的步骤。
1.在SpringMVC核心配置文件springmvc.xml中配置文件解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="104857600">property> <property name="defaultEncoding" value="uft-8">property> bean>2.创建JSP表单 upload2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上传title> head> <body> <h3>文件上传h3> <%-- 上传表单的提交方式必须是post,get方式没有请求体,提交的数据较少,而上传文件的数据量大,所以使用post提交 --%> <%-- enctype属性为multipart/form-data,意思是不对表单数据进行编码,在使用包含文件上传控件的表单时,必须使用该值 --%> <form action="/fileUpload2" method="post" enctype="multipart/form-data"> <%-- 文件选择控件,类型是file,必须要有name属性--%> 选择文件:<input type="file" name="file"> <input type="submit" value="上传"> form> body> html>3.编写控制器接收上传请求
//MultipartFile参数名必须和JSP文件控件的name属性一致,即名为file @RequestMapping("/fileUpload2") public String upload2(MultipartFile file,HttpServletRequest request) throws IOException { // 创建文件夹,存放上传文件 // 1.设置上传文件夹的真实路径 String realPath = request.getSession().getServletContext().getRealPath("/upload"); // 2.判断该目录是否存在,如果不存在,创建该目录 File dir = new File(realPath); if(!dir.exists()){ dir.mkdirs(); } //将上传的数据写到文件夹的文件中 //1.拿到上传的文件名 String filename = file.getOriginalFilename(); //为了避免重名的情况,可以给文件名加个前缀,当多次上传同一个文件时不重名 filename = UUID.randomUUID()+"_"+filename; //2.创建空文件 File newFile = new File(dir,filename); //3.将数据写入空文件中 file.transferTo(newFile); return "index"; }4. 请求路径:localhost:8080/upload2.jsp
四、SpringMVC上传_上传多文件
SpringMVC 支持一次性上传多个文件,写法如下:1.创建JSP表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上传title> head> <body> <h3>文件上传h3> <%-- 上传表单的提交方式必须是post,get方式没有请求体,提交的数据较少,而上传文件的数据量大,所以使用post提交 --%> <%-- enctype属性为multipart/form-data,意思是不对表单数据进行编码,在使用包含文件上传控件的表单时,必须使用该值 --%> <form action="/fileUpload3" method="post" enctype="multipart/form-data"> 用户名:<input name="username"> <%-- 文件选择控件,类型是file,必须要有name属性,name属性名都为files,因为后台是files数组接收--%> 文件1:<input type="file" name="files"> 文件2:<input type="file" name="files"> <input type="submit" value="上传"> form> body> html>2.编写控制器接收上传请求
//MultipartFile参数名必须和JSP文件控件的name属性一致,即名为files @RequestMapping("/fileUpload3") public String upload3(String username,MultipartFile files[],HttpServletRequest request) throws IOException { System.out.println(username); // 创建文件夹,存放上传文件 // 1.设置上传文件夹的真实路径 String realPath = request.getSession().getServletContext().getRealPath("/upload"); // 2.判断该目录是否存在,如果不存在,创建该目录 File dir = new File(realPath); if(!dir.exists()){ dir.mkdirs(); } for (MultipartFile file:files){ //将上传的数据写到文件夹的文件中 //1.拿到上传的文件名 String filename = file.getOriginalFilename(); //为了避免重名的情况,可以给文件名加个前缀,当多次上传同一个文件时不重名 filename = UUID.randomUUID()+"_"+filename; //2.创建空文件 File newFile = new File(dir,filename); //3.将数据写入空文件中 file.transferTo(newFile); } return "index"; }3.请求路径:localhost:8080/upload3.jsp
五、SpringMVC上传_异步上传
之前的上传方案,在上传成功后都会跳转页面。而在实际开发中,很多情况下上传后不进行跳转,而是进行页面的局部刷新,比如:上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。
1.编写JSP页面upload4.jsp,引入jQuery和jQuery表单上传工具 jquery.form.js
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上传title> <script src="/js/jquery-2.1.1.min.js">script> <script src="/js/jquery.form.js">script> head> <body> <h3>文件上传h3> <form id="ajaxForm" enctype="multipart/form-data"> <input type="file" name="file"/> <%--按钮类型不能是submit,否则会刷新页面--%> <input type="button" value="上传头像" id="btn"> form> <%--头像预览图--%> <img src="/" width="100" id="header"> <script> $(function () { $("#btn").click(function(){ //异步提交表单 $("#ajaxForm").ajaxSubmit({ url:"/fileUpload4", type:"post", success:function (data) { $("#header").attr("src",data); } }) }) }) script> body> html>2.编写控制器接收异步上传请求
@RequestMapping("/fileUpload4") @ResponseBody public String upload4(MultipartFile file,HttpServletRequest request) throws IOException { // 创建文件夹,存放上传文件 // 1.设置上传文件夹的真实路径 String realPath = request.getSession().getServletContext().getRealPath("/upload"); // 2.判断该目录是否存在,如果不存在,创建该目录 File dir = new File(realPath); if(!dir.exists()){ dir.mkdirs(); } //将上传的数据写到文件夹的文件中 //1.拿到上传的文件名 String filename = file.getOriginalFilename(); filename = UUID.randomUUID()+"_"+filename; //2.创建空文件 File newFile = new File(dir,filename); //3.将数据写入空文件中 file.transferTo(newFile); return "/upload"+filename; }3.请求路径:localhost:8080/upload4.jsp
六、SpringMVC文件上传_跨服务器上传
由于文件占据磁盘空间较大,在实际开发中往往会将文件上传到其他服务器中,此时需要使用跨服务器上传文件。
1.解压一个tomcat作为图片服务器,在tomcat的webapps下创建upload目录作为文件上传目录。
2.修改tomcat的 conf/web.xml 文件,支持跨服上传。(tomcat默认为只读,所以不能接收文件)
<servlet> <init-param> <param-name>readonlyparam-name> <param-value>falseparam-value> init-param> servlet>3.修改tomcat的 conf/server.xml 文件,修改tomcat端口,修改完开启tomcat服务器<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />4.编写JSP上传表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上传title> <script src="/js/jquery-2.1.1.min.js">script> <script src="/js/jquery.form.js">script> head> <body> <h3>文件上传h3> <form id="ajaxForm" enctype="multipart/form-data"> <input type="file" name="file"/> <%--按钮类型不能是submit,否则会刷新页面--%> <input type="button" value="上传头像" id="btn"> form> <%--头像预览图--%> <img src="/" width="100" id="header"> <script> $(function () { $("#btn").click(function(){ //异步提交表单 $("#ajaxForm").ajaxSubmit({ url:"/fileUpload5", type:"post", success:function (data) { $("#header").attr("src",data); } }) }) }) script> body> html>5.添加跨服上传依赖
<dependency> <groupId>com.sun.jerseygroupId> <artifactId>jersey-coreartifactId> <version>1.18.1version> dependency> <dependency> <groupId>com.sun.jerseygroupId> <artifactId>jersey-clientartifactId> <version>1.18.1version> dependency>6.创建控制器方法,该方法在接受到上传请求后将文件保存到其他服务器上。
@RequestMapping("/fileUpload5") @ResponseBody public String upload5(MultipartFile file,HttpServletRequest request) throws IOException { //设置跨服上传的服务器路径 String path = "http://localhost:8081/upload/"; //获取上传的文件名 String filename = file.getOriginalFilename(); filename = UUID.randomUUID()+"_"+filename; //跨服上传 //1.创建客户端对象 Client client = Client.create(); //2.使用客户端对象连接图片服务器 WebResource resource = client.resource(path+filename); //3.传输数据 resource.put(file.getBytes()); return path+filename; }7.请求路径:localhost:8080/upload5.jsp
注意:运行跨服务上传文件时,要先打开tomcat服务器,文件会保存到webapps下的upload文件夹中。
七、SpringMVC文件上传_文件下载
将文件上传到服务器后,有时我们需要让用户下载上传的文件,接下来我们编写文件下载功能:
查询所有可下载的文件:
1.编写控制器方法,查询所有可下载的文件,并跳转到下载页面
@Controller public class DownLoadController { //查询可下载的文件 @RequestMapping("/showFiles") public String showFileDown(HttpServletRequest request, Model model){ //1.获取下载文件路径集合。注意:跨服务器上传中,网络路径无法获取文件列表。 String path = request.getSession().getServletContext().getRealPath("/upload"); File file = new File(path); String[] files = file.list(); //2.将路径放入模型中,跳转到JSP页面 model.addAttribute("files",files); return "download"; } }2.添加JSTL依赖
<dependency> <groupId>org.apache.taglibsgroupId> <artifactId>taglibs-standard-specartifactId> <version>1.2.5version> dependency> <dependency> <groupId>org.apache.taglibsgroupId> <artifactId>taglibs-standard-implartifactId> <version>1.2.5version> dependency> dependencies>3.编写下载控制器
//编写下载控制器,文件下载 @RequestMapping("/download") public void fileDown(HttpServletRequest request, HttpServletResponse response,String fileName) throws IOException { //设置响应头 response.setHeader("Content-Disposition","attachment;fileName="+fileName); //获取文件路径 String path = request.getSession().getServletContext().getRealPath("/upload"); File file = new File(path,fileName); //获取字节输入流 ServletOutputStream os = response.getOutputStream(); //使用输入流写出文件 os.write(FileUtils.readFileToByteArray(file)); os.flush(); os.close(); }4.编写下载页面download.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>下载title> head> <body> <h3>文件下载h3> <%--遍历文件集合--%> <c:forEach items="${files}" var="file"> <a href="/download?fileName=${file}">${file}a><br/> c:forEach> body> html>5.请求路径:localhost:8080/showFiles
点击文件名即可下载。
八、知识点整理:
1.上传文件表单的提交方式必须为“POST ”
2.上传文件表单的 enctype 属性必须为“multipart/form-data”
3.SpringMVC上传文件,会将表单的文件封装为“MultipartFile ”对象
4.SpringMVC上传文件, MultipartFile 对象的“transferTo ”方法可以将数据写入文件
5.jQuery表单上传工具 jquery.form.js 异步表单提交方法为"ajaxSubmit"
6.修改tomcat的“只读属性为false ”才能支持跨服上传