欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

SpringBoot 上传文件(使用表单)

最编程 2024-05-01 21:14:46
...

大家好,又见面了,我是你们的朋友全栈君。

介绍

文件上传是企业开发中最常用的功能。本文主要介绍SpringBoot中使用表单上传时单文件上传和多文件上传的操作方式。

maven依赖

代码语言:javascript
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>

配置文件

代码语言:javascript
复制
spring:
  mvc:
    view:
      prefix: /WEB-INF/jsp/
      suffix: .jsp

  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 100MB

分别配置jsp的前后缀、上传文件总的最大值和单个文件最大值

上传文件工具类

这里的静态方法executeUpload接收两个参数,分别是服务器储存文件位置和文件对象类。将接收的文件对象转储到服务器目录中。

代码语言:javascript
复制
package com.example.fileuploadbyform.utils;

import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.UUID;

public  class FileUtil {

    public static void executeUpload(String uploadDir, MultipartFile file) throws Exception{
            //文件后缀
            String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            //文件随机名
            String filename = UUID.randomUUID()+suffix;
            //创建文件对象
            File serverFile = new File(uploadDir + filename);
            //转储文件
            file.transferTo(serverFile);
    }
}

单文件上传

我们准备一个upload.jsp文件用来上传文件

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>
</body>
</html>

在来到controller层新建一个FileUploadController文件

代码语言:javascript
复制
@RequestMapping("/oneFile")
    public String index(){
        return "upload";
    }


@RequestMapping("/upload")
    @ResponseBody
    public String upload(HttpServletRequest req, MultipartFile file){
        try{

            String uploadDir = req.getSession().getServletContext().getRealPath("/")+"upload/";
            File dir = new File(uploadDir);
            if(!dir.exists()){
                dir.mkdir();
            }
            FileUtil.executeUpload(uploadDir,file);
        }catch(Exception e){
            e.printStackTrace();
            return "上传失败";
        }
        return "上传成功";
    }

多文件上传

多文件上传比起单文件上传有所不同的就是对接收的文件数组做了一个循环储存,下面是代码。

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/uploads" method="post" enctype="multipart/form-data">
    文件一<input type="file" name="file">
    文件二<input type="file" name="file">
    文件三<input type="file" name="file">
    <input type="submit" value="上传">
</form>
</body>
</html>
代码语言:javascript
复制
   @RequestMapping("/twoFile")
    public String index1(){
        return "uploads";
    }

    @RequestMapping("/uploads")
    @ResponseBody
    public String uploads(HttpServletRequest req, MultipartFile[] file){
        try{
            String uploadDir = req.getSession().getServletContext().getRealPath("/")+"upload/";
            File dir = new File(uploadDir);
            if(!dir.exists()){
                dir.mkdir();
            }
            for(int i=0;i<file.length;i++){
                if(file[i] != null){
                    FileUtil.executeUpload(uploadDir,file[i]);
                }
            }
        }catch(Exception e){
            e.printStackTrace();
            return "上传失败";
        }
        return "上传成功";
    }

易错点

1、调用executeUpload之前要判断文件对象是否为空 2、application.yml文件中要配置上传文件最大限制和单个文件上传限制 3、多文件上传时统一form中input的type为file的name要统一,方便controller层中的MultipartFile数组接收