• SpringBoot实现MultipartFile文件上传


    1、SpringBoot采用FileUpload组件实现上传处理,在控制器中可以使用MultipartFile类进行接收。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
     5     https://maven.apache.org/xsd/maven-4.0.0.xsd">
     6     <modelVersion>4.0.0</modelVersion>
     7     <parent>
     8         <groupId>org.springframework.boot</groupId>
     9         <artifactId>spring-boot-starter-parent</artifactId>
    10         <version>2.3.5.RELEASE</version>
    11         <relativePath /> <!-- lookup parent from repository -->
    12     </parent>
    13     <groupId>com.example</groupId>
    14     <artifactId>demo</artifactId>
    15     <version>0.0.1-SNAPSHOT</version>
    16     <name>demo</name>
    17     <description>Demo project for Spring Boot</description>
    18 
    19     <properties>
    20         <java.version>1.8</java.version>
    21         <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    22     </properties>
    23 
    24     <dependencies>
    25         <dependency>
    26             <groupId>org.springframework.boot</groupId>
    27             <artifactId>spring-boot-starter-web</artifactId>
    28         </dependency>
    29 
    30         <dependency>
    31             <groupId>org.springframework.boot</groupId>
    32             <artifactId>spring-boot-starter-test</artifactId>
    33             <scope>test</scope>
    34             <exclusions>
    35                 <exclusion>
    36                     <groupId>org.junit.vintage</groupId>
    37                     <artifactId>junit-vintage-engine</artifactId>
    38                 </exclusion>
    39             </exclusions>
    40         </dependency>
    41         <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
    42         <dependency>
    43             <groupId>org.hibernate</groupId>
    44             <artifactId>hibernate-validator</artifactId>
    45             <version>6.1.0.Final</version>
    46         </dependency>
    47         <dependency>
    48             <groupId>org.springframework.boot</groupId>
    49             <artifactId>spring-boot-starter-thymeleaf</artifactId>
    50         </dependency>
    51     </dependencies>
    52 
    53     <build>
    54         <plugins>
    55             <plugin>
    56                 <groupId>org.springframework.boot</groupId>
    57                 <artifactId>spring-boot-maven-plugin</artifactId>
    58             </plugin>
    59         </plugins>
    60         <resources>
    61             <resource>
    62                 <directory>src/main/resources</directory>
    63                 <includes>
    64                     <include>**/*.properties</include>
    65                     <include>**/*.yml</include>
    66                     <include>**/*.xml</include>
    67                     <include>**/*.p12</include>
    68                     <include>**/*.html</include>
    69                     <include>**/*.jpg</include>
    70                     <include>**/*.png</include>
    71                 </includes>
    72             </resource>
    73         </resources>
    74     </build>
    75 
    76 </project>

    创建控制器类UploadController,利用MultipartFile将上传文件保存在本地磁盘。

     1 package com.demo.controller;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 import java.util.HashMap;
     6 import java.util.Map;
     7 import java.util.UUID;
     8 
     9 import org.springframework.stereotype.Controller;
    10 import org.springframework.web.bind.annotation.RequestMapping;
    11 import org.springframework.web.bind.annotation.RequestMethod;
    12 import org.springframework.web.bind.annotation.RequestParam;
    13 import org.springframework.web.bind.annotation.ResponseBody;
    14 import org.springframework.web.context.request.RequestAttributes;
    15 import org.springframework.web.context.request.RequestContextHolder;
    16 import org.springframework.web.context.request.ServletRequestAttributes;
    17 import org.springframework.web.multipart.MultipartFile;
    18 
    19 /**
    20  * 
    21  * @author
    22  *
    23  */
    24 @Controller
    25 public class UploadController {
    26 
    27     /**
    28      * 首先根据此方法跳转到upload.html界面
    29      * 
    30      * @return
    31      */
    32     @RequestMapping(value = "/upload_pre", method = RequestMethod.GET)
    33     public String uploadPre() {
    34         return "upload";
    35     }
    36 
    37     /**
    38      * 文件上传
    39      * 
    40      * @param name
    41      * @param multipartFile
    42      * @return
    43      * @throws IllegalStateException
    44      * @throws IOException
    45      */
    46     @RequestMapping(value = "/upload", method = RequestMethod.POST)
    47     @ResponseBody
    48     public Object upload(String name, @RequestParam(value = "multipartFile") MultipartFile multipartFile)
    49             throws IllegalStateException, IOException {
    50         Map<String, Object> map = new HashMap<String, Object>();
    51         if (multipartFile != null) {
    52             // 设置文件名称
    53             map.put("nameParam", name);
    54             // 设置文件名称
    55             map.put("fileame", multipartFile.getName());
    56             // 设置文件类型
    57             map.put("contentType", multipartFile.getContentType());
    58             // 设置文件大小
    59             map.put("fileSize", multipartFile.getSize());
    60             // 创建文件名称
    61             String fileName = UUID.randomUUID() + "."
    62                     + multipartFile.getContentType().substring(multipartFile.getContentType().lastIndexOf("/") + 1);
    63             // 获取到文件的路径信息
    64             RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    65             ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
    66             String filePath = servletRequestAttributes.getRequest().getServletContext().getRealPath("/") + fileName;
    67             // 打印保存路径
    68             System.out.println(filePath);
    69             // 保存文件的路径信息
    70             map.put("filePath", filePath);
    71             // 创建文件
    72             File saveFile = new File(filePath);
    73             // 文件保存
    74             multipartFile.transferTo(saveFile);
    75             // 返回信息
    76             return map;
    77         } else {
    78             return "no file ";
    79         }
    80     }
    81 
    82 }

    在src/main/resources/templates下面创建upload.html文件。

     1 <!DOCTYPE html>
     2 <html xmlns="http://www.thymeleaf.org"></html>
     3 <head>
     4 <meta charset="UTF-8">
     5 <title>搞事情啊!!!</title>
     6 </head>
     7 <body>
     8     <h1>搞事情啊!!!</h1>
     9 
    10     <form th:action="@{/upload}" method="post" enctype="multipart/form-data">
    11         姓名:<input type="text" name="name"/><br/>
    12             <!-- 切记,这里的name="multipartFile"必须和控制层的参数一致性MultipartFile multipartFile -->
    13         照片:<input type="file" name="multipartFile"/><br/>
    14         <input type="submit" value="上传"/><br/>
    15     </form>
    16 
    17 </body>
    18 </html>

    控制层类UploadController接收到此请求信息后,如果有上传文件存在,则会直接返回上传信息(开发者也可以根据情况选择将文件保存)。

    演示效果,如下所示:

    2、Springboot上传文件限制,在实际项目开发中,需要对用户上传文件的大小进行限制,这样才可以保证服务器的资源不被浪费。修改application.properties配置文件,如下所示:

     1 # 启用http上传
     2 spring.servlet.multipart.enabled=true
     3 # 设置支持的单个上传文件的大小限制
     4 spring.servlet.multipart.max-file-size=10MB
     5 # 设置最大的请求文件大小,设置总体大小请求
     6 spring.servlet.multipart.max-request-size=20MB
     7 # 当上传文件达到指定配置量的时候,将文件内容写入磁盘
     8 spring.servlet.multipart.file-size-threshold=512KB
     9 # 设置上传的临时目录
    10 spring.servlet.multipart.location=/

    对于Springboot上传文件的上传限制,也可以利用Bean实现同样的效果,实现代码,如下所示:

     1 package com.demo.config;
     2 
     3 import javax.servlet.MultipartConfigElement;
     4 
     5 import org.springframework.boot.web.servlet.MultipartConfigFactory;
     6 import org.springframework.context.annotation.Bean;
     7 import org.springframework.context.annotation.Configuration;
     8 import org.springframework.util.unit.DataSize;
     9 
    10 @Configuration
    11 public class UploadConfig {
    12 
    13     @Bean
    14     public MultipartConfigElement getMultipartConfig() {
    15         MultipartConfigFactory config = new MultipartConfigFactory();
    16         // 设置上传文件的单个大小限制
    17         config.setMaxRequestSize(DataSize.parse("10MB"));
    18         // 设置总的上传的大小限制
    19         config.setMaxRequestSize(DataSize.parse("100MB"));
    20         // 设置临时保存目录
    21         config.setLocation("/");
    22         // 创建一个上传配置并返回
    23         return config.createMultipartConfig();
    24     }
    25 
    26 }

    3、Springboot上传多个文件如果要进行多个文件的上传,需要通过MultipartHttpServletRequest进行文件接收。首先修改upload.html页面,定义多个文件上传控件。

     1 <!DOCTYPE html>
     2 <html xmlns="http://www.thymeleaf.org"></html>
     3 <head>
     4 <meta charset="UTF-8">
     5 <title>搞事情啊!!!</title>
     6 </head>
     7 <body>
     8     <h1>搞事情啊!!!</h1>
     9 
    10     <form th:action="@{/upload}" method="post" enctype="multipart/form-data">
    11         姓名:<input type="text" name="name"/><br/>
    12             <!-- 切记,这里的name="multipartFile"必须和控制层的参数一致性MultipartFile multipartFile -->
    13         文件一:<input type="file" name="multipartFile"/><br/>
    14         文件二:<input type="file" name="multipartFile"/><br/>
    15         文件三:<input type="file" name="multipartFile"/><br/>
    16         <input type="submit" value="上传"/><br/>
    17     </form>
    18 
    19 </body>
    20 </html>

    修改UploadController.java控制器,实现多个文件上传,此时可以根据接受参数的不同,方法可以有不同的实现 ,如果接受参数是这样的,@RequestParam(value = "multipartFile") MultipartFile[] multipartFile,实现代码,如下所示:

     1 package com.demo.controller;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 import java.util.HashMap;
     6 import java.util.Map;
     7 import java.util.UUID;
     8 
     9 import org.springframework.stereotype.Controller;
    10 import org.springframework.web.bind.annotation.RequestMapping;
    11 import org.springframework.web.bind.annotation.RequestMethod;
    12 import org.springframework.web.bind.annotation.RequestParam;
    13 import org.springframework.web.bind.annotation.ResponseBody;
    14 import org.springframework.web.context.request.RequestAttributes;
    15 import org.springframework.web.context.request.RequestContextHolder;
    16 import org.springframework.web.context.request.ServletRequestAttributes;
    17 import org.springframework.web.multipart.MultipartFile;
    18 
    19 /**
    20  * 
    21  * @author
    22  *
    23  */
    24 @Controller
    25 public class UploadController {
    26 
    27     /**
    28      * 首先根据此方法跳转到upload.html界面
    29      * 
    30      * @return
    31      */
    32     @RequestMapping(value = "/upload_pre", method = RequestMethod.GET)
    33     public String uploadPre() {
    34         return "upload";
    35     }
    36 
    37     /**
    38      * 文件上传
    39      * 
    40      * @param name
    41      * @param multipartFile
    42      * @return
    43      * @throws IllegalStateException
    44      * @throws IOException
    45      */
    46     @RequestMapping(value = "/upload", method = RequestMethod.POST)
    47     @ResponseBody
    48     public Object upload(String name, @RequestParam(value = "multipartFile") MultipartFile[] multipartFile)
    49             throws IllegalStateException, IOException {
    50         Map<String, Object> map = new HashMap<String, Object>();
    51         if (multipartFile != null && multipartFile.length > 0) {
    52             for (int i = 0; i < multipartFile.length; i++) {
    53                 // 设置文件名称
    54                 map.put("nameParam", name);
    55                 // 设置文件名称
    56                 map.put("fileame", multipartFile[i].getName());
    57                 // 设置文件类型
    58                 map.put("contentType", multipartFile[i].getContentType());
    59                 // 设置文件大小
    60                 map.put("fileSize", multipartFile[i].getSize());
    61                 // 创建文件名称
    62                 String fileName = UUID.randomUUID() + "." + multipartFile[i].getContentType()
    63                         .substring(multipartFile[i].getContentType().lastIndexOf("/") + 1);
    64                 // 获取到文件的路径信息
    65                 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    66                 ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
    67                 String filePath = servletRequestAttributes.getRequest().getServletContext().getRealPath("/") + fileName;
    68                 // 打印保存路径
    69                 System.out.println(filePath);
    70                 // 保存文件的路径信息
    71                 map.put("filePath", filePath);
    72                 // 创建文件
    73                 File saveFile = new File(filePath);
    74                 // 文件保存
    75                 multipartFile[i].transferTo(saveFile);
    76                 // 返回信息
    77             }
    78             return map;
    79         } else {
    80             return "no file ";
    81         }
    82     }
    83 
    84 }

    如果接受参数是HttpServletRequest request,代码是这样的,明显没有第一种方便,如下所示:

      1 package com.demo.controller;
      2 
      3 import java.io.File;
      4 import java.io.IOException;
      5 import java.util.ArrayList;
      6 import java.util.HashMap;
      7 import java.util.Iterator;
      8 import java.util.List;
      9 import java.util.Map;
     10 import java.util.UUID;
     11 
     12 import javax.servlet.http.HttpServletRequest;
     13 
     14 import org.springframework.stereotype.Controller;
     15 import org.springframework.web.bind.annotation.RequestMapping;
     16 import org.springframework.web.bind.annotation.RequestMethod;
     17 import org.springframework.web.bind.annotation.RequestParam;
     18 import org.springframework.web.bind.annotation.ResponseBody;
     19 import org.springframework.web.context.request.RequestAttributes;
     20 import org.springframework.web.context.request.RequestContextHolder;
     21 import org.springframework.web.context.request.ServletRequestAttributes;
     22 import org.springframework.web.multipart.MultipartFile;
     23 import org.springframework.web.multipart.MultipartHttpServletRequest;
     24 
     25 /**
     26  * 
     27  * @author
     28  *
     29  */
     30 @Controller
     31 public class UploadController {
     32 
     33     /**
     34      * 首先根据此方法跳转到upload.html界面
     35      * 
     36      * @return
     37      */
     38     @RequestMapping(value = "/upload_pre", method = RequestMethod.GET)
     39     public String uploadPre() {
     40         return "upload";
     41     }
     42 
     43     /**
     44      * 文件上传
     45      * 
     46      * @param name
     47      * @param multipartFile
     48      * @return
     49      * @throws IllegalStateException
     50      * @throws IOException
     51      */
     52     @RequestMapping(value = "/upload", method = RequestMethod.POST)
     53     @ResponseBody
     54     public Object upload2(String name, HttpServletRequest request) throws IllegalStateException, IOException {
     55         List<String> result = new ArrayList<String>();
     56         if (request instanceof MultipartHttpServletRequest) {
     57             MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
     58             List<MultipartFile> files = multipartHttpServletRequest.getFiles("multipartFile");
     59             Iterator<MultipartFile> iterator = files.iterator();
     60             while (iterator.hasNext()) {
     61                 // 取出每一个文件
     62                 MultipartFile file = iterator.next();
     63                 try {
     64                     // 保存上传信息
     65                     result.add(this.saveFile(file));
     66                 } catch (Exception e) {
     67                     e.printStackTrace();
     68                 }
     69             }
     70         }
     71         return result;
     72     }
     73 
     74     /**
     75      * 文件保存处理
     76      * 
     77      * @param file
     78      *            上传文件
     79      * @return 文件保存路径
     80      * @throws Exception
     81      *             上传异常
     82      */
     83     public String saveFile(MultipartFile multipartFile) throws Exception {
     84         String filePath = "no file!!!";
     85         if (multipartFile != null && multipartFile.getSize() > 0) {
     86             // 创建文件名称
     87             String fileName = UUID.randomUUID() + "."
     88                     + multipartFile.getContentType().substring(multipartFile.getContentType().lastIndexOf("/") + 1);
     89             // 获取到文件的路径信息
     90             RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
     91             ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
     92             filePath = servletRequestAttributes.getRequest().getServletContext().getRealPath("/") + fileName;
     93             // 打印保存路径
     94             System.out.println(filePath);
     95             File saveFile = new File(filePath);
     96             // 文件保存
     97             multipartFile.transferTo(saveFile);
     98         }
     99         return filePath;
    100     }
    101 
    102 }
  • 相关阅读:
    js 每个月有多少天算法
    js 树的操作
    画线
    程序员如何防止脑疲劳
    汉字求出拼音缩写
    datagird 多行外于编辑状态
    overflow: hidden 失效
    CSS 相对/绝对(relative/absolute)定位系列(三)
    display:inlineblock在Chrome与FF下导致的间隙
    css ul li 的使用及浏览器兼容问题
  • 原文地址:https://www.cnblogs.com/biehongli/p/13964515.html
Copyright © 2020-2023  润新知