【SpringBoot】16 文件上传(Thymeleaf)

介绍

文件上传是指将本地的图片、视频、音频等文件上传到服务器,供其他用户浏览下载的过程,文件上传在日常项目中用的非常广泛。

实现代码

第一步:在配置文件新增如下配置

application.yml

yml 复制代码
spring:
  servlet:
    multipart:
      max-file-size: 10MB #默认为1MB    
      max-request-size: 10MB #默认为10MB
file:
  upload:
    path: F:/files/

第二步:编写文件上传页面

upload.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head lang="en">
    <meta charset="UTF-8" />
    <title>文件上传页面</title>
</head>
<body>
<h1>文件上传页面</h1>
<form method="post" action="/upload" enctype="multipart/form-data">
    选择要上传的txt格式文件:<input type="file" name="file"><br>
    <hr>
    <input type="submit" value="提交">
</form>
</body>
</html>

第三步:编写文件上传页面和对应接口

FileController.java

java 复制代码
package com.lm.system.controller;

import com.lm.system.exception.FileException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

/**
 * @author DUHAOLIN
 * @date 2024/10/15
 */
@Controller
public class FileController {

    private final static String FILE_FORMAT_TXT = ".txt";
    @Value("${file.upload.path}")
    private String path;

    @GetMapping("uploadPage")
    public String uploadPage() {
        return "upload";
    }

    @PostMapping("upload")
    @ResponseBody
    public String upload(@RequestParam("file") MultipartFile file) throws IOException {
        //校验文件
        try {
            checkFile(file);
        } catch (FileException e) {
            e.printStackTrace();
            return e.getMessage();
        }

        String filename = path + file.getOriginalFilename().replace(FILE_FORMAT_TXT, "_" + System.currentTimeMillis() + FILE_FORMAT_TXT);
        File newFile = new File(filename);
        Files.copy(file.getInputStream(), newFile.toPath());
        return "新文件已生成," + newFile.getAbsolutePath();
    }

    private void checkFile(MultipartFile file) {
        //校验文件大小
        if (file.getSize() > 10485760L) //10MB
            throw new RuntimeException("文件大于10MB");

        //校验文件名
        checkFilename(file.getOriginalFilename());
    }

    private void checkFilename(String filename) {
        if (!StringUtils.hasText(filename))
            throw new FileException("文件名有误");
        if (!filename.endsWith(FILE_FORMAT_TXT))
            throw new FileException("文件类型有误");
    }

  

}

第四步:添加文件异常类

FileException.java

java 复制代码
package com.lm.system.exception;

/**
 * @author DUHAOLIN
 * @date 2024/10/15
 */
public class FileException extends RuntimeException {
    public FileException() {
        super();
    }

    public FileException(String message) {
        super(message);
    }

    public FileException(String message, Throwable cause) {
        super(message, cause);
    }
}

效果图

上传不正确的非 .txt 格式的文件

上传确认的 .txt 文件

相关推荐
lUie INGA44 分钟前
在2023idea中如何创建SpringBoot
java·spring boot·后端
geBR OTTE1 小时前
SpringBoot中整合ONLYOFFICE在线编辑
java·spring boot·后端
Porunarufu1 小时前
博客系统UI自动化测试报告
java
NineData1 小时前
NineData 新增支持 GaussDB 到 StarRocks 实时数据复制能力
后端
sghuter2 小时前
数字资源分发架构解密
后端·架构·dubbo
小码哥_常2 小时前
Spring Boot启动慢?这5个优化点带你起飞
后端
NineData2 小时前
NineData将亮相DACon 2026上海站!解锁AGI时代数据“智理”新范式
数据库·后端·架构
of Watermelon League2 小时前
SpringBoot集成Flink-CDC,实现对数据库数据的监听
数据库·spring boot·flink
Aurorar0rua2 小时前
CS50 x 2024 Notes C - 05
java·c语言·数据结构