文件上传是一个常见的需求。例如社交平台用户上传头像、电商系统商家上传商品图片、文档管理系统用户上传资料等都会用到。本文详细介绍SpringBoot关于单文件上传、多文件上传以及限制文件大小和类型等几种常见方式。

1. 单文件上传

单文件上传是最基础的文件上传场景,当用户选择一个文件并提交到服务器,可以使用 MultipartFile 类型来接收上传的文件。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
public class SingleFileUploadController {

    @PostMapping("/singleFileUpload")
    @ResponseBody
    public String singleFileUpload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "请选择要上传的文件";
        }
        try {
            // 获取文件名
            String fileName = file.getOriginalFilename();
            // 定义文件存储路径
            String filePath = "uploads/";
            File dest = new File(filePath + fileName);
            // 检查目录是否存在,不存在则创建
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            // 保存文件
            file.transferTo(dest);
            return "文件上传成功";
        } catch (IOException e) {
            e.printStackTrace();
            return "文件上传失败";
        }
    }
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>单文件上传</title>
</head>
<body>
    <form action="/singleFileUpload" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" value="上传">
    </form>
</body>
</html>

enctype="multipart/form-data"是必须的



2. 多文件上传

多文件上传允许用户一次选择多个文件进行上传。可以使用 MultipartFile 数组来接收多个上传的文件。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
public class MultipleFileUploadController {

    @PostMapping("/multipleFileUpload")
    @ResponseBody
    public String multipleFileUpload(@RequestParam("files") MultipartFile[] files) {
        if (files.length == 0) {
            return "请选择要上传的文件";
        }
        for (MultipartFile file : files) {
            if (file.isEmpty()) {
                continue;
            }
            try {
                String fileName = file.getOriginalFilename();
                String filePath = "uploads/";
                File dest = new File(filePath + fileName);
                if (!dest.getParentFile().exists()) {
                    dest.getParentFile().mkdirs();
                }
                file.transferTo(dest);
            } catch (IOException e) {
                e.printStackTrace();
                return "文件上传失败";
            }
        }
        return "文件上传成功";
    }
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>多文件上传</title>
</head>
<body>
    <form action="/multipleFileUpload" method="post" enctype="multipart/form-data">
        <input type="file" name="files" multiple>
        <input type="submit" value="上传">
    </form>
</body>
</html>

input组件需要 multiple 支持多文件选择



3. 限制文件大小和类型

在实际开发的时候,可能需要对上传的文件大小和类型进行限制。可以通过配置SpringBoot的 MultipartConfigElement 来实现文件大小限制,同时在代码中检查文件类型。

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;

import javax.servlet.MultipartConfigElement;

@Configuration
public class MultipartConfig {

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        // 单个文件最大10MB
        factory.setMaxFileSize(DataSize.ofMegabytes(10));
        // 设置总上传数据总大小20MB
        factory.setMaxRequestSize(DataSize.ofMegabytes(20));
        return factory.createMultipartConfig();
    }
}

检查文件类型:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
public class FileUploadWithLimitController {

    @PostMapping("/fileUploadWithLimit")
    @ResponseBody
    public String fileUploadWithLimit(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "请选择要上传的文件";
        }
        // 检查文件类型
        String contentType = file.getContentType();
        if (!"image/jpeg".equals(contentType) && !"image/png".equals(contentType)) {
            return "只允许上传jpeg和png格式文件";
        }
        try {
            String fileName = file.getOriginalFilename();
            String filePath = "uploads/";
            File dest = new File(filePath + fileName);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            file.transferTo(dest);
            return "文件上传成功";
        } catch (IOException e) {
            e.printStackTrace();
            return "文件上传失败";
        }
    }
}

getContentType 方法可以获取文件的MIME类型



← 上一篇 Java进阶——常用类及常用方法详解
记得点赞、关注、收藏哦!
下一篇 Java进阶——数组超详细整理 →
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐