简单文件上传功能实现

实现一个简单的文件上传功能

在现代 web 开发中,文件上传功能是一项常见而必要的需求,无论是用户上传图片、文档还是其他文件类型。下面我们将基于 Java 编程语言,使用 Spring Boot 框架来实现一个简单的文件上传功能。


1. 功能需求

用户可以通过前端表单上传文件到服务器,服务器收到文件后将其保存在磁盘指定目录中,同时返回文件保存路径供后续使用。要求支持常见文件类型(如图片、文档等),并对文件大小限制。


2. 技术选型

  • 开发语言:Java
  • 框架:Spring Boot
  • 文件存储:磁盘存储(也可扩展为云存储)
  • 工具依赖:
    • Spring Web(处理 HTTP 请求与接口)
    • Spring Boot DevTools(热部署)
    • Apache Commons IO(可选,用于文件操作)

3. 解决方案

(1) 项目初始化
使用 Spring Initializr 创建一个 Java 项目,添加 Spring Web 依赖。

(2) 构建 Controller
创建一个 FileUploadController 负责接收前端文件上传的请求。核心逻辑如下:

  • 接口路径为 /upload,接收 POST 请求。
  • 使用 @RequestParam 注解接收上传的文件。
  • 检查文件合法性(文件大小、文件类型等)。
  • 保存文件到磁盘,并返回结果给调用者。

示例代码:

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

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

@RestController
@RequestMapping("/file")
public class FileUploadController {

    private static final String UPLOAD_DIRECTORY = "C:/uploads/";

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "上传失败,文件为空!";
        }
        try {
            // 获取原始文件名
            String originalFilename = file.getOriginalFilename();
            // 指定文件保存路径
            File destFile = new File(UPLOAD_DIRECTORY + originalFilename);
            // 确保父目录存在
            if (!destFile.getParentFile().exists()) {
                destFile.getParentFile().mkdirs();
            }
            // 将文件保存到指定目录
            file.transferTo(destFile);
            return "文件上传成功,路径:" + destFile.getAbsolutePath();
        } catch (IOException e) {
            return "文件上传失败:" + e.getMessage();
        }
    }
}

(3) 构建前端表单
为了简单起见,可以用 HTML 构建一个前端文件上传表单。

示例代码:

<!DOCTYPE html>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <h1>文件上传</h1>
    <form action="/file/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <button type="submit">上传</button>
    </form>
</body>
</html>

(4) 增加文件验证
在上传文件之前,我们可能需要验证文件大小和类型。例如,限制上传文件不能超过 5MB,仅支持 .jpg、.png 或 .txt 类型:

@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
    if (file.isEmpty()) {
        return "上传失败,文件为空!";
    }
    // 限制文件大小
    if (file.getSize() > 5 * 1024 * 1024) {
        return "上传失败,文件大小不能超过 5MB!";
    }
    // 校验文件类型
    String fileType = file.getContentType();
    if (!("image/jpeg".equals(fileType) || "image/png".equals(fileType) || "text/plain".equals(fileType))) {
        return "上传失败,不支持的文件格式!";
    }
    try {
        ...
    } catch (IOException e) {
        ...
    }
}

(5) 配置文件存储路径
为了更灵活,可以将上传目录路径配置在 application.properties 文件中:

file.upload-dir=C:/uploads/

然后在代码中通过 @Value 动态获取配置值:

@Value("${file.upload-dir}")
private String uploadDirectory;

4. 总结

通过上述步骤,我们成功实现了一个简单的文件上传功能。系统能够接收用户上传的文件,并将其保存到服务器指定目录,同时对文件大小和类型进行验证。进一步优化的话,可以添加更多的功能,比如:

  • 文件下载功能。
  • 数据库记录文件信息(文件名、路径等)。
  • 使用云服务(如 AWS S3、阿里云 OSS)存储文件,替代本地磁盘方案。
  • 添加权限校验,限制不同用户的文件访问权限。

文件上传是一个基础功能,但可以衍生出非常多的应用场景,基于业务需求和扩展性可以进行多样性设计。