• 05 SpringMVC文件上传、下载


    目录

    一、创建项目,配置相关配置

    二、SpringMVC上传_原生方式上传

    三、SpringMVC上传_SpringMVC方式上传

    四、SpringMVC上传_上传多文件

    五、SpringMVC上传_异步上传

    六、SpringMVC文件上传_跨服务器上传

    七、SpringMVC文件上传_文件下载

    查询所有可下载的文件:

    下载文件控制器

    八、知识点整理:


    一、创建项目,配置相关配置

    项目结构

    1.配置web.xml

    1. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    4. http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    5. <display-name>Archetype Created Web Applicationdisplay-name>
    6. <filter>
    7. <filter-name>encFilterfilter-name>
    8. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    9. <init-param>
    10. <param-name>encodingparam-name>
    11. <param-value>utf-8param-value>
    12. init-param>
    13. filter>
    14. <filter-mapping>
    15. <filter-name>encFilterfilter-name>
    16. <url-pattern>/*url-pattern>
    17. filter-mapping>
    18. <filter>
    19. <filter-name>httpMethodFilterfilter-name>
    20. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
    21. filter>
    22. <filter-mapping>
    23. <filter-name>httpMethodFilterfilter-name>
    24. <url-pattern>/*url-pattern>
    25. filter-mapping>
    26. <servlet>
    27. <servlet-name>dispatcherServletservlet-name>
    28. <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    29. <init-param>
    30. <param-name>contextConfigLocationparam-name>
    31. <param-value>classpath:springmvc.xmlparam-value>
    32. init-param>
    33. <load-on-startup>1load-on-startup>
    34. servlet>
    35. <servlet-mapping>
    36. <servlet-name>dispatcherServletservlet-name>
    37. <url-pattern>/url-pattern>
    38. servlet-mapping>
    39. web-app>

    2.引入依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframeworkgroupId>
    4. <artifactId>spring-contextartifactId>
    5. <version>5.2.12.RELEASEversion>
    6. dependency>
    7. <dependency>
    8. <groupId>org.springframeworkgroupId>
    9. <artifactId>spring-webartifactId>
    10. <version>5.2.12.RELEASEversion>
    11. dependency>
    12. <dependency>
    13. <groupId>org.springframeworkgroupId>
    14. <artifactId>spring-webmvcartifactId>
    15. <version>5.2.12.RELEASEversion>
    16. dependency>
    17. <dependency>
    18. <groupId>javax.servletgroupId>
    19. <artifactId>servlet-apiartifactId>
    20. <version>2.5version>
    21. <scope>providedscope>
    22. dependency>
    23. <dependency>
    24. <groupId>javax.servlet.jspgroupId>
    25. <artifactId>jsp-apiartifactId>
    26. <version>2.0version>
    27. <scope>providedscope>
    28. dependency>
    29. <dependency>
    30. <groupId>com.fasterxml.jackson.coregroupId>
    31. <artifactId>jackson-coreartifactId>
    32. <version>2.9.0version>
    33. dependency>
    34. <dependency>
    35. <groupId>com.fasterxml.jackson.coregroupId>
    36. <artifactId>jackson-databindartifactId>
    37. <version>2.9.0version>
    38. dependency>
    39. <dependency>
    40. <groupId>com.fasterxml.jackson.coregroupId>
    41. <artifactId>jackson-annotationsartifactId>
    42. <version>2.9.0version>
    43. dependency>
    44. <dependency>
    45. <groupId>commons-fileuploadgroupId>
    46. <artifactId>commons-fileuploadartifactId>
    47. <version>1.3.1version>
    48. dependency>
    49. <dependency>
    50. <groupId>commons-iogroupId>
    51. <artifactId>commons-ioartifactId>
    52. <version>2.4version>
    53. dependency>
    54. <dependency>
    55. <groupId>com.sun.jerseygroupId>
    56. <artifactId>jersey-coreartifactId>
    57. <version>1.18.1version>
    58. dependency>
    59. <dependency>
    60. <groupId>com.sun.jerseygroupId>
    61. <artifactId>jersey-clientartifactId>
    62. <version>1.18.1version>
    63. dependency>
    64. <dependency>
    65. <groupId>org.apache.taglibsgroupId>
    66. <artifactId>taglibs-standard-specartifactId>
    67. <version>1.2.5version>
    68. dependency>
    69. <dependency>
    70. <groupId>org.apache.taglibsgroupId>
    71. <artifactId>taglibs-standard-implartifactId>
    72. <version>1.2.5version>
    73. dependency>
    74. dependencies>
    75. <build>
    76. <plugins>
    77. <plugin>
    78. <groupId>org.apache.tomcat.mavengroupId>
    79. <artifactId>tomcat7-maven-pluginartifactId>
    80. <version>2.1version>
    81. <configuration>
    82. <port>8080port>
    83. <path>/path>
    84. <uriEncoding>UTF-8uriEncoding>
    85. <server>tomcat7server>
    86. <systemProperties>
    87. <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>
    88. systemProperties>
    89. configuration>
    90. plugin>
    91. plugins>
    92. build>

    3.在配置文件springmvc.xml中配置相关配置

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:mvc="http://www.springframework.org/schema/mvc"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xsi:schemaLocation=" http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/mvc
    8. http://www.springframework.org/schema/mvc/spring-mvc.xsd
    9. http://www.springframework.org/schema/context
    10. http://www.springframework.org/schema/context/spring-context.xsd">
    11. <context:component-scan base-package="com.itbaizhan">context:component-scan>
    12. <mvc:annotation-driven >mvc:annotation-driven>
    13. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    14. <property name="prefix" value="/" />
    15. <property name="suffix" value=".jsp" />
    16. bean>
    17. <mvc:default-servlet-handler />
    18. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    19. <property name="maxUploadSize" value="104857600">property>
    20. <property name="defaultEncoding" value="uft-8">property>
    21. bean>
    22. beans>

    二、SpringMVC上传_原生方式上传

     上传是Web工程中很常见的功能,SpringMVC框架简化了文件上传的代码,我们首先使用JAVAEE原生方式上传文件:

    1.创建新的SpringMVC项目(Maven-webapp),在web.xml中将项目从2.3改为3.1,即可默认开启el表达式

    1. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    4. http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    5. web-app>

    2.编写上传表单

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>上传title>
    5. head>
    6. <body>
    7. <h3>文件上传h3>
    8. <%-- 上传表单的提交方式必须是post,get方式没有请求体,提交的数据较少,而上传文件的数据量大,所以使用post提交 --%>
    9. <%-- enctype属性为multipart/form-data,意思是不对表单数据进行编码,在使用包含文件上传控件的表单时,必须使用该值 --%>
    10. <form action="/fileUpload" method="post" enctype="multipart/form-data">
    11. <%-- 文件选择控件,类型是file,必须要有name属性--%>
    12. 选择文件:<input type="file" name="upload">
    13. <input type="submit" value="上传">
    14. form>
    15. body>
    16. html>

    3.编写控制器接收上传请求,控制器进行三步操作:

    (1)创建文件夹,存放上传文件。

    (2)分析请求体,找到上传文件数据。

    (3)将文件数据写入文件夹。

    1. @RequestMapping("/fileUpload")
    2. public String upload(HttpServletRequest request) throws Exception {
    3. // 创建文件夹,存放上传文件
    4. // 1.设置上传文件夹的真实路径
    5. String realPath = request.getSession().getServletContext().getRealPath("/upload");
    6. // 2.判断该目录是否存在,如果不存在,创建该目录
    7. File file = new File(realPath);
    8. if(!file.exists()){
    9. file.mkdirs();
    10. }
    11. // 分析请求体,找到上传文件数据
    12. // 1.创建磁盘文件工厂
    13. DiskFileItemFactory factory = new DiskFileItemFactory();
    14. // 2.创建上传数据分析器对象
    15. ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
    16. // 3.利用分析器对象解析请求体,返回所有数据项
    17. List fileItems = servletFileUpload.parseRequest(request);
    18. // 4.遍历所有数据,找到文件项(非表单项)
    19. for (FileItem fileItem:fileItems){
    20. if(!fileItem.isFormField()){
    21. // 将文件数据写入文件夹
    22. // 1.获取文件名
    23. String name = fileItem.getName();
    24. // 2.将文件写入磁盘
    25. fileItem.write(new File(file,name));
    26. // 3.删除内存中的临时文件
    27. fileItem.delete();
    28. }
    29. }
    30. return "index";
    31. }

    4.请求路径:localhost:8080/upload.jsp

    三、SpringMVC上传_SpringMVC方式上传

     SpringMVC使用框架提供的文件解析器对象,可以直接将请求体中的文件数据转为MultipartFile对象,从而省略原生上传中分析请求体的步骤。

    1.SpringMVC核心配置文件springmvc.xml中配置文件解析器

    1. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    2. <property name="maxUploadSize" value="104857600">property>
    3. <property name="defaultEncoding" value="uft-8">property>
    4. bean>

    2.创建JSP表单 upload2.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>上传title>
    5. head>
    6. <body>
    7. <h3>文件上传h3>
    8. <%-- 上传表单的提交方式必须是post,get方式没有请求体,提交的数据较少,而上传文件的数据量大,所以使用post提交 --%>
    9. <%-- enctype属性为multipart/form-data,意思是不对表单数据进行编码,在使用包含文件上传控件的表单时,必须使用该值 --%>
    10. <form action="/fileUpload2" method="post" enctype="multipart/form-data">
    11. <%-- 文件选择控件,类型是file,必须要有name属性--%>
    12. 选择文件:<input type="file" name="file">
    13. <input type="submit" value="上传">
    14. form>
    15. body>
    16. html>

    3.编写控制器接收上传请求

    1. //MultipartFile参数名必须和JSP文件控件的name属性一致,即名为file
    2. @RequestMapping("/fileUpload2")
    3. public String upload2(MultipartFile file,HttpServletRequest request) throws IOException {
    4. // 创建文件夹,存放上传文件
    5. // 1.设置上传文件夹的真实路径
    6. String realPath = request.getSession().getServletContext().getRealPath("/upload");
    7. // 2.判断该目录是否存在,如果不存在,创建该目录
    8. File dir = new File(realPath);
    9. if(!dir.exists()){
    10. dir.mkdirs();
    11. }
    12. //将上传的数据写到文件夹的文件中
    13. //1.拿到上传的文件名
    14. String filename = file.getOriginalFilename();
    15. //为了避免重名的情况,可以给文件名加个前缀,当多次上传同一个文件时不重名
    16. filename = UUID.randomUUID()+"_"+filename;
    17. //2.创建空文件
    18. File newFile = new File(dir,filename);
    19. //3.将数据写入空文件中
    20. file.transferTo(newFile);
    21. return "index";
    22. }

    4. 请求路径:localhost:8080/upload2.jsp

    四、SpringMVC上传_上传多文件

    SpringMVC 支持一次性上传多个文件,写法如下:

    1.创建JSP表单

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>上传title>
    5. head>
    6. <body>
    7. <h3>文件上传h3>
    8. <%-- 上传表单的提交方式必须是post,get方式没有请求体,提交的数据较少,而上传文件的数据量大,所以使用post提交 --%>
    9. <%-- enctype属性为multipart/form-data,意思是不对表单数据进行编码,在使用包含文件上传控件的表单时,必须使用该值 --%>
    10. <form action="/fileUpload3" method="post" enctype="multipart/form-data">
    11. 用户名:<input name="username">
    12. <%-- 文件选择控件,类型是file,必须要有name属性,name属性名都为files,因为后台是files数组接收--%>
    13. 文件1:<input type="file" name="files">
    14. 文件2:<input type="file" name="files">
    15. <input type="submit" value="上传">
    16. form>
    17. body>
    18. html>

    2.编写控制器接收上传请求

    1. //MultipartFile参数名必须和JSP文件控件的name属性一致,即名为files
    2. @RequestMapping("/fileUpload3")
    3. public String upload3(String username,MultipartFile files[],HttpServletRequest request) throws IOException {
    4. System.out.println(username);
    5. // 创建文件夹,存放上传文件
    6. // 1.设置上传文件夹的真实路径
    7. String realPath = request.getSession().getServletContext().getRealPath("/upload");
    8. // 2.判断该目录是否存在,如果不存在,创建该目录
    9. File dir = new File(realPath);
    10. if(!dir.exists()){
    11. dir.mkdirs();
    12. }
    13. for (MultipartFile file:files){
    14. //将上传的数据写到文件夹的文件中
    15. //1.拿到上传的文件名
    16. String filename = file.getOriginalFilename();
    17. //为了避免重名的情况,可以给文件名加个前缀,当多次上传同一个文件时不重名
    18. filename = UUID.randomUUID()+"_"+filename;
    19. //2.创建空文件
    20. File newFile = new File(dir,filename);
    21. //3.将数据写入空文件中
    22. file.transferTo(newFile);
    23. }
    24. return "index";
    25. }

    3.请求路径:localhost:8080/upload3.jsp

    五、SpringMVC上传_异步上传

     之前的上传方案,在上传成功后都会跳转页面。而在实际开发中,很多情况下上传后不进行跳转,而是进行页面的局部刷新,比如:上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。

    1.编写JSP页面upload4.jsp,引入jQueryjQuery表单上传工具 jquery.form.js

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>上传title>
    5. <script src="/js/jquery-2.1.1.min.js">script>
    6. <script src="/js/jquery.form.js">script>
    7. head>
    8. <body>
    9. <h3>文件上传h3>
    10. <form id="ajaxForm" enctype="multipart/form-data">
    11. <input type="file" name="file"/>
    12. <%--按钮类型不能是submit,否则会刷新页面--%>
    13. <input type="button" value="上传头像" id="btn">
    14. form>
    15. <%--头像预览图--%>
    16. <img src="/" width="100" id="header">
    17. <script>
    18. $(function () {
    19. $("#btn").click(function(){
    20. //异步提交表单
    21. $("#ajaxForm").ajaxSubmit({
    22. url:"/fileUpload4",
    23. type:"post",
    24. success:function (data) {
    25. $("#header").attr("src",data);
    26. }
    27. })
    28. })
    29. })
    30. script>
    31. body>
    32. html>

    2.编写控制器接收异步上传请求

    1. @RequestMapping("/fileUpload4")
    2. @ResponseBody
    3. public String upload4(MultipartFile file,HttpServletRequest request) throws IOException {
    4. // 创建文件夹,存放上传文件
    5. // 1.设置上传文件夹的真实路径
    6. String realPath = request.getSession().getServletContext().getRealPath("/upload");
    7. // 2.判断该目录是否存在,如果不存在,创建该目录
    8. File dir = new File(realPath);
    9. if(!dir.exists()){
    10. dir.mkdirs();
    11. }
    12. //将上传的数据写到文件夹的文件中
    13. //1.拿到上传的文件名
    14. String filename = file.getOriginalFilename();
    15. filename = UUID.randomUUID()+"_"+filename;
    16. //2.创建空文件
    17. File newFile = new File(dir,filename);
    18. //3.将数据写入空文件中
    19. file.transferTo(newFile);
    20. return "/upload"+filename;
    21. }

    3.请求路径:localhost:8080/upload4.jsp

    六、SpringMVC文件上传_跨服务器上传

     由于文件占据磁盘空间较大,在实际开发中往往会将文件上传到其他服务器中,此时需要使用跨服务器上传文件。

    1.解压一个tomcat作为图片服务器,在tomcatwebapps下创建upload目录作为文件上传目录。

    2.修改tomcatconf/web.xml 文件,支持跨服上传。(tomcat默认为只读,所以不能接收文件)

    1. <servlet>    
    2.    <init-param>        
    3.        <param-name>readonlyparam-name>
    4.        <param-value>falseparam-value>  
    5.    init-param>
    6. servlet>
    3.修改tomcatconf/server.xml 文件,修改tomcat端口,修改完开启tomcat服务器
    <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

    4.编写JSP上传表单

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>上传title>
    5. <script src="/js/jquery-2.1.1.min.js">script>
    6. <script src="/js/jquery.form.js">script>
    7. head>
    8. <body>
    9. <h3>文件上传h3>
    10. <form id="ajaxForm" enctype="multipart/form-data">
    11. <input type="file" name="file"/>
    12. <%--按钮类型不能是submit,否则会刷新页面--%>
    13. <input type="button" value="上传头像" id="btn">
    14. form>
    15. <%--头像预览图--%>
    16. <img src="/" width="100" id="header">
    17. <script>
    18. $(function () {
    19. $("#btn").click(function(){
    20. //异步提交表单
    21. $("#ajaxForm").ajaxSubmit({
    22. url:"/fileUpload5",
    23. type:"post",
    24. success:function (data) {
    25. $("#header").attr("src",data);
    26. }
    27. })
    28. })
    29. })
    30. script>
    31. body>
    32. html>

    5.添加跨服上传依赖

    1. <dependency>
    2. <groupId>com.sun.jerseygroupId>
    3. <artifactId>jersey-coreartifactId>
    4. <version>1.18.1version>
    5. dependency>
    6. <dependency>
    7. <groupId>com.sun.jerseygroupId>
    8. <artifactId>jersey-clientartifactId>
    9. <version>1.18.1version>
    10. dependency>

    6.创建控制器方法,该方法在接受到上传请求后将文件保存到其他服务器上。

    1. @RequestMapping("/fileUpload5")
    2. @ResponseBody
    3. public String upload5(MultipartFile file,HttpServletRequest request) throws IOException {
    4. //设置跨服上传的服务器路径
    5. String path = "http://localhost:8081/upload/";
    6. //获取上传的文件名
    7. String filename = file.getOriginalFilename();
    8. filename = UUID.randomUUID()+"_"+filename;
    9. //跨服上传
    10. //1.创建客户端对象
    11. Client client = Client.create();
    12. //2.使用客户端对象连接图片服务器
    13. WebResource resource = client.resource(path+filename);
    14. //3.传输数据
    15. resource.put(file.getBytes());
    16. return path+filename;
    17. }

    7.请求路径:localhost:8080/upload5.jsp

    注意:运行跨服务上传文件时,要先打开tomcat服务器,文件会保存到webapps下的upload文件夹中。

    七、SpringMVC文件上传_文件下载

     将文件上传到服务器后,有时我们需要让用户下载上传的文件,接下来我们编写文件下载功能:

    查询所有可下载的文件:

    1.编写控制器方法,查询所有可下载的文件,并跳转到下载页面

    1. @Controller
    2. public class DownLoadController {
    3. //查询可下载的文件
    4. @RequestMapping("/showFiles")
    5. public String showFileDown(HttpServletRequest request, Model model){
    6. //1.获取下载文件路径集合。注意:跨服务器上传中,网络路径无法获取文件列表。
    7. String path = request.getSession().getServletContext().getRealPath("/upload");
    8. File file = new File(path);
    9. String[] files = file.list();
    10. //2.将路径放入模型中,跳转到JSP页面
    11. model.addAttribute("files",files);
    12. return "download";
    13. }
    14. }

    2.添加JSTL依赖

    1. <dependency>
    2. <groupId>org.apache.taglibsgroupId>
    3. <artifactId>taglibs-standard-specartifactId>
    4. <version>1.2.5version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.taglibsgroupId>
    8. <artifactId>taglibs-standard-implartifactId>
    9. <version>1.2.5version>
    10. dependency>
    11. dependencies>

    3.编写下载控制器

    1. //编写下载控制器,文件下载
    2. @RequestMapping("/download")
    3. public void fileDown(HttpServletRequest request, HttpServletResponse response,String fileName) throws IOException {
    4. //设置响应头
    5. response.setHeader("Content-Disposition","attachment;fileName="+fileName);
    6. //获取文件路径
    7. String path = request.getSession().getServletContext().getRealPath("/upload");
    8. File file = new File(path,fileName);
    9. //获取字节输入流
    10. ServletOutputStream os = response.getOutputStream();
    11. //使用输入流写出文件
    12. os.write(FileUtils.readFileToByteArray(file));
    13. os.flush();
    14. os.close();
    15. }

    4.编写下载页面download.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    3. <html>
    4. <head>
    5. <title>下载title>
    6. head>
    7. <body>
    8. <h3>文件下载h3>
    9. <%--遍历文件集合--%>
    10. <c:forEach items="${files}" var="file">
    11. <a href="/download?fileName=${file}">${file}a><br/>
    12. c:forEach>
    13. body>
    14. 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 ”才能支持跨服上传

  • 相关阅读:
    CO41创建生产订单维护增强字段
    macOS鼠标管理操作增强BetterMouse简体中文
    【Python】Python进阶
    执行计划管理 (SPM)
    逻辑回归(Logistic Regression)
    QT QDockWidget
    RxJava操作符
    Java旅游网站管理系统毕业设计、Java旅游线路和景点网站设计与实现 毕设作品参考
    Flowable 的使用
    洋葱架构、三层架构及两者区别
  • 原文地址:https://blog.csdn.net/m0_51697147/article/details/126461012