【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 文件

相关推荐
爬山算法8 分钟前
Hibernate(47)Hibernate的会话范围(Scope)如何控制?
java·后端·hibernate
雨中飘荡的记忆10 分钟前
Caffeine入门到实战
java
砚边数影10 分钟前
AI开发依赖引入:DL4J / Java-ML 框架 Maven 坐标配置
java·数据库·人工智能·深度学习·机器学习·ai·maven
一路向北North11 分钟前
nacos更改配置值后,应用提示Refresh keys changed 但是注入的值没有发生变化
java
黎雁·泠崖1 小时前
Java面向对象:this关键字+构造方法+标准JavaBean
java·开发语言·python
sheji34161 小时前
【开题答辩全过程】以 基于Java的智慧环卫垃圾收运管理系统设计与实现为例,包含答辩的问题和答案
java·开发语言
jason成都1 小时前
实战 | 国产数据库 R2DBC-JDBC 桥接踩坑记 - JetLinks适配达梦数据库
java·数据库·物联网
BullSmall1 小时前
SEDA (Staged Event-Driven Architecture, 分阶段事件驱动架构
java·spring·架构
源码宝1 小时前
云HIS二次开发实施路径指南
后端·源码·二次开发·saas·云his·医院信息系统
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-DDD(领域驱动设计)核心概念及落地架构全总结(含事件驱动协同逻辑)
java·人工智能·spring boot·微服务·架构·事件驱动·领域驱动