• SpringMVC入门宝典(六)SpringMVC文件上传(上)


    目录

    一.原生方式上传

    二.SpringMVC方式上传

    三.上传多文件


    一.原生方式上传

    上传是 Web 工程中很常见的功能, SpringMVC 框架简化了文件上传的代码,我们首先使用 JAVAEE
    原生方式上传文件:
    创建一个子模块
    1
    (1)创建新的 SpringMVC 项目(即上面的子模块),在 web.xml 中将项目从 2.3 改为 3.1 即可默
    认开启 el 表达式 ,修改web.xml内容如下:
    1. <web-app
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    5. http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    6. id="WebApp_ID" version="3.1">
    7. <display-name>Archetype Created Web Application</display-name>
    8. </web-app>

    并把上个子模块的pom.xml里的依赖和插件复制到这个子模块中。

    pom.xml:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <groupId>com.first</groupId>
    6. <artifactId>mvc_demo2</artifactId>
    7. <version>1.0-SNAPSHOT</version>
    8. <packaging>war</packaging>
    9. <name>mvc_demo2 Maven Webapp</name>
    10. <!-- FIXME change it to the project's website -->
    11. <url>http://www.example.com</url>
    12. <dependencies>
    13. <!-- Spring核心模块 -->
    14. <dependency>
    15. <groupId>org.springframework</groupId>
    16. <artifactId>spring-context</artifactId>
    17. <version>5.2.12.RELEASE</version>
    18. </dependency>
    19. <!-- SpringWeb模块 -->
    20. <dependency>
    21. <groupId>org.springframework</groupId>
    22. <artifactId>spring-web</artifactId>
    23. <version>5.2.12.RELEASE</version>
    24. </dependency>
    25. <!-- SpringMVC模块 -->
    26. <dependency>
    27. <groupId>org.springframework</groupId>
    28. <artifactId>spring-webmvc</artifactId>
    29. <version>5.2.12.RELEASE</version>
    30. </dependency>
    31. <!-- Servlet -->
    32. <dependency>
    33. <groupId>javax.servlet</groupId>
    34. <artifactId>servlet-api</artifactId>
    35. <version>2.5</version>
    36. <!--设为provided使运行时使用tomcat自带的servlet,下面的jsp也是一样-->
    37. <scope>provided</scope>
    38. </dependency>
    39. <!-- JSP -->
    40. <dependency>
    41. <groupId>javax.servlet.jsp</groupId>
    42. <artifactId>jsp-api</artifactId>
    43. <version>2.0</version>
    44. <scope>provided</scope>
    45. </dependency>
    46. <!-- jackson -->
    47. <dependency>
    48. <groupId>com.fasterxml.jackson.core</groupId>
    49. <artifactId>jackson-core</artifactId>
    50. <version>2.9.0</version>
    51. </dependency>
    52. <dependency>
    53. <groupId>com.fasterxml.jackson.core</groupId>
    54. <artifactId>jackson-databind</artifactId>
    55. <version>2.9.0</version>
    56. </dependency>
    57. <dependency>
    58. <groupId>com.fasterxml.jackson.core</groupId>
    59. <artifactId>jackson-annotations</artifactId>
    60. <version>2.9.0</version>
    61. </dependency>
    62. </dependencies>
    63. <build>
    64. <plugins>
    65. <!-- tomcat插件 -->
    66. <plugin>
    67. <groupId>org.apache.tomcat.maven</groupId>
    68. <artifactId>tomcat7-maven-plugin</artifactId>
    69. <version>2.1</version>
    70. <configuration>
    71. <port>8080</port>
    72. <path>/</path>
    73. <uriEncoding>UTF-8</uriEncoding>
    74. <server>tomcat7</server>
    75. <systemProperties>
    76. <java.util.logging.SimpleFormatter.format>%1$tH:%1$tM:%1$tS %2$s%n%4$s: %5$s%6$s%n
    77. </java.util.logging.SimpleFormatter.format>
    78. </systemProperties>
    79. </configuration>
    80. </plugin>
    81. </plugins>
    82. </build>
    83. </project>

    springmvc.xml:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans
    3. xmlns="http://www.springframework.org/schema/beans"
    4. xmlns:mvc="http://www.springframework.org/schema/mvc"
    5. xmlns:context="http://www.springframework.org/schema/context"
    6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans
    8. http://www.springframework.org/schema/beans/spring-beans.xsd
    9. http://www.springframework.org/schema/mvc
    10. http://www.springframework.org/schema/mvc/spring-mvc.xsd
    11. http://www.springframework.org/schema/context
    12. http://www.springframework.org/schema/context/spring-context.xsd">
    13. <!-- 扫描包 -->
    14. <context:component-scan base-package="com.first"/>
    15. <!-- 开启SpringMVC注解的支持 -->
    16. <mvc:annotation-driven ></mvc:annotation-driven>
    17. <!-- 视图解析器 -->
    18. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    19. <!-- 视图前缀 ,因为我放在webapp下,所以前缀是/,如果放在WEB-INF下,value就是/WEB-INF-->
    20. <property name="prefix" value="/" />
    21. <!-- 视图后缀 -->
    22. <property name="suffix" value=".jsp" />
    23. </bean>
    24. <!-- 放行静态资源 -->
    25. <mvc:default-servlet-handler />
    26. </beans>

    然后web.xml再添加一些上个子工程的一些配置 ,

    1. <web-app
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    5. http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    6. id="WebApp_ID" version="3.1">
    7. <display-name>Archetype Created Web Application</display-name>
    8. <!--SpringMVC中提供的字符编码过滤器,放在所有过滤器的最上方-->
    9. <filter>
    10. <filter-name>encFilter</filter-name>
    11. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    12. <init-param>
    13. <param-name>encoding</param-name>
    14. <param-value>utf-8</param-value>
    15. </init-param>
    16. </filter>
    17. <filter-mapping>
    18. <filter-name>encFilter</filter-name>
    19. <url-pattern>/*</url-pattern>
    20. </filter-mapping>
    21. <!-- 请求方式过滤器 -->
    22. <filter>
    23. <filter-name>httpMethodFilter</filter-name>
    24. <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    25. </filter>
    26. <filter-mapping>
    27. <filter-name>httpMethodFilter</filter-name>
    28. <!--所有路径都过滤-->
    29. <url-pattern>/*</url-pattern>
    30. </filter-mapping>
    31. <!--SpringMVC前端控制器,本质是一个Servlet,接收所有请求,再分发到相应路径中,在容器启动时就会加载-->
    32. <servlet>
    33. <servlet-name>dispatcherServlet</servlet-name>
    34. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    35. <init-param>
    36. <param-name>contextConfigLocation</param-name>
    37. <!--springMVC配置文件的位置-->
    38. <param-value>classpath:springmvc.xml</param-value>
    39. </init-param>
    40. <!--在web容器创建时,servlet就会被创建好-->
    41. <load-on-startup>1</load-on-startup>
    42. </servlet>
    43. <servlet-mapping>
    44. <servlet-name>dispatcherServlet</servlet-name>
    45. <!--接收所有的请求-->
    46. <url-pattern>/</url-pattern>
    47. </servlet-mapping>
    48. </web-app>

    (2)编写上传表单

    upload.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. <form action="/fileUpload" method="post" enctype="multipart/form-data">
    9. <%-- 文件上传控件,类型是file --%>
    10. 选择文件:<input type="file" name="upload">
    11. <input type="submit" value="上传">
    12. </form>
    13. </body>
    14. </html>

    然后如下创建:

    1. package com.first.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import javax.servlet.ServletInputStream;
    5. import javax.servlet.http.HttpServletRequest;
    6. @Controller
    7. public class UploadController {
    8. @RequestMapping("/fileUpload")
    9. public String upload(HttpServletRequest request) throws Exception {
    10. // 获取输入流
    11. ServletInputStream is = request.getInputStream();
    12. // 从输入流获取请求体数据
    13. int i = 0;
    14. while ((i=is.read())!=-1){
    15. System.out.print((char)i);
    16. }
    17. return "index";
    18. }
    19. }

    访问 http://localhost:8080/upload.jsp

     控制台部分输出如下:

    (3)接收请求体数据:

    接下来需要分析请求体中的文件项,并将数据写入磁盘,此时需要借助文件上传工具
    (1)引入文件上传依赖:
    1. <!-- 文件上传 -->
    2. <dependency>
    3.    <groupId>commons-fileupload</groupId>
    4.    <artifactId>commonsfileupload</artifactId>
    5.    <version>1.3.1</version>
    6. </dependency> <dependency>
    7.    <groupId>commons-io</groupId>
    8.    <artifactId>commons-io</artifactId>
    9.    <version>2.4</version>
    10. </dependency>
    (2)编写控制器接收上传请求,控制器进行三步操作:
    1. 创建文件夹,存放上传文件。
    2. 分析请求体,找到上传文件数据。
    3. 将文件数据写入文件夹。
    1. package com.first.controller;
    2. import org.apache.commons.fileupload.FileItem;
    3. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    4. import org.apache.commons.fileupload.servlet.ServletFileUpload;
    5. import org.springframework.stereotype.Controller;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. import javax.servlet.http.HttpServletRequest;
    8. import java.io.File;
    9. import java.util.List;
    10. @Controller
    11. public class UploadController {
    12. //原生上传方式
    13. @RequestMapping("/fileUpload")
    14. public String upload(HttpServletRequest request) throws Exception {
    15. // 创建文件夹,存放上传文件
    16. // 1.设置上传文件夹的真实路径
    17. String realPath = request.getSession().getServletContext().getRealPath("/upload");
    18. // 2.判断该目录是否存在,如果不存在,创建该目录
    19. File file = new File(realPath);
    20. if(!file.exists()){
    21. file.mkdirs();
    22. }
    23. // 分析请求体,找到上传文件数据
    24. // 1.创建磁盘文件工厂
    25. DiskFileItemFactory factory = new DiskFileItemFactory();
    26. // 2.创建上传数据分析器对象
    27. ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
    28. // 3.利用分析器对象解析请求体,返回所有数据项
    29. List<FileItem> fileItems = servletFileUpload.parseRequest(request);
    30. // 4.遍历所有数据,找到文件项(非表单项)
    31. for (FileItem fileItem:fileItems){
    32. if(!fileItem.isFormField()){
    33. // 将文件数据写入文件夹
    34. // 1.获取文件名
    35. String name = fileItem.getName();
    36. // 2.将文件写入磁盘
    37. fileItem.write(new File(file,name));
    38. // 3.删除内存中的临时文件
    39. fileItem.delete();
    40. }
    41. }
    42. return "index";
    43. }
    44. }

    访问http://localhost:8080/upload.jsp

    二.SpringMVC方式上传

    SpringMVC 使用框架提供的文件解析器对象,可以直接将请求体中的文件数据转为 MultipartFile 对象,从而省略原生上传中分析请求 体的步骤。
    1
    1.在 SpringMVC 核心配置文件配置文件解析器
    1. <!-- 文件解析器对象,id名称必须是multipartResolver -->
    2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    3. <!-- 支持一次上传文件的总容量。单位:字节 100M = 100*1024*1024-->
    4. <property name="maxUploadSize" value="104857600"/>
    5. <!-- 文件名的编码方式-->
    6. <property name="defaultEncoding" value="utf-8"/>
    7. </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. <form action="/fileUpload2" method="post" enctype="multipart/form-data">
    9. <%-- 文件上传控件,类型是file --%>
    10. 选择文件:<input type="file" name="file">
    11. <input type="submit" value="上传">
    12. </form>
    13. </body>
    14. </html>

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

    1. // MultipartFile参数名必须和JSP文件空间的name属性一致
    2. @RequestMapping("/fileUpload2")
    3. public String upload2(MultipartFile file, HttpServletRequest request) throws IOException {
    4. // 创建文件夹,存放上传文件
    5. String realPath = request.getSession().getServletContext().getRealPath("/upload");
    6. File dir = new File(realPath);
    7. if(!dir.exists()){
    8. dir.mkdirs();
    9. }
    10. // 将上传的数据写到文件夹的文件中
    11. // 1.拿到上传的文件名
    12. String filename = file.getOriginalFilename();
    13. filename = UUID.randomUUID()+"_"+filename;
    14. // 2.创建空文件
    15. File newFile = new File(dir,filename);
    16. // 3.将数据写入空文件中
    17. file.transferTo(newFile);
    18. //视图解析器,跳转到index.jsp页面
    19. return "index";
    20. }

    访问http://localhost:8080/upload2.jsp

     选择一个文件上传,比如一张图片,然后自动跳转到index.jsp页面中

     然后查看webapp目录下,自动创建了upload文件夹,且此文件夹下有上传的图片。

    三.上传多文件

    SpringMVC 支持一次性上传多个文件,写法如下:
    1 up
    1.创建 JSP 表单 upload3.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. <form action="/fileUpload3" method="post" enctype="multipart/form-data">
    9. <%-- 文件上传控件,类型是file --%>
    10. 用户名:<input name="username">
    11. 选择文件:<input type="file" name="files">
    12. 选择文件:<input type="file" name="files">
    13. <input type="submit" value="上传">
    14. </form>
    15. </body>
    16. </html>

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

    1. @RequestMapping("/fileUpload3")
    2. public String upload3(String username,MultipartFile[] files,HttpServletRequest request) throws IOException {
    3. System.out.println(username);
    4. // 创建文件夹,存放上传文件
    5. String realPath = request.getSession().getServletContext().getRealPath("/upload");
    6. File dir = new File(realPath);
    7. if(!dir.exists()){
    8. dir.mkdirs();
    9. }
    10. // 遍历数组,将上传的文件保存到文件夹
    11. for (MultipartFile file : files) {
    12. String filename = file.getOriginalFilename();
    13. filename = UUID.randomUUID()+"_"+filename;
    14. File newFile = new File(dir, filename);
    15. file.transferTo(newFile);
    16. }
    17. return "index";
    18. }

    访问:http://localhost:8080/upload3.jsp

     点击上传

     控制台输出:

     查看webapp下upload文件夹

  • 相关阅读:
    ADC噪声全面分析 -03- 利用噪声分析进行实际设计
    ShanDong Multi-University Training #3
    Hadoop第五章:序列化
    K8S常用kubectl命令汇总(持续更新中)
    回溯算法01-组合(Java)
    实战案例(MDL语句)
    基于Ray的分布式版本的决策树与随机森林
    mysql根据多字段分组——group by带两个或多个参数
    Matplotlib绘图-快速上手可视化工具
    双十一最值得入手什么,盘点几款最实用的数码好物
  • 原文地址:https://blog.csdn.net/weixin_44593822/article/details/125444219