在现代 Web 开发中,文件上传与下载是常见的功能需求。Spring Boot 为我们提供了一个简单而强大的框架,用于实现这些功能。本文将详细讲解如何基于 Spring Boot 实现文件的上传和下载,并附上完整的代码示例。

一、项目依赖

首先,在 pom.xml 文件中添加必需的依赖项:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>

二、配置文件

我们可以在 application.properties 中设置文件上传的最大大小限制和存储路径(可选):

# 设置上传文件的最大大小
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

# 自定义文件存储路径
file.upload-dir=uploads

三、创建文件上传与下载的控制器

接下来,我们需要创建一个控制器来处理文件上传和下载的请求。以下是 Controller 的实现代码:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@Controller
@RequestMapping("/files")
public class FileController {

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

    // 文件上传接口
    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("上传文件不能为空");
        }

        try {
            // 创建目标目录
            File dir = new File(uploadDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // 保存文件
            Path filePath = Paths.get(uploadDir, file.getOriginalFilename());
            file.transferTo(filePath);

            return ResponseEntity.ok("文件上传成功: " + file.getOriginalFilename());
        } catch (IOException e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败");
        }
    }

    // 文件下载接口
    @GetMapping("/download/{filename}")
    public ResponseEntity<byte[]> downloadFile(@PathVariable String filename) {
        try {
            Path filePath = Paths.get(uploadDir, filename);
            byte[] data = Files.readAllBytes(filePath);

            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename);

            return new ResponseEntity<>(data, headers, HttpStatus.OK);
        } catch (IOException e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
        }
    }
}

四、主应用程序类

接下来,创建一个 Spring Boot 应用程序的主类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FileUploadDownloadApplication {
    public static void main(String[] args) {
        SpringApplication.run(FileUploadDownloadApplication.class, args);
    }
}

五、测试接口

现在,我们可以运行 Spring Boot 应用程序并测试文件上传和下载。以下是常用的测试方式:

  1. 文件上传:
  2. 使用 Postman 进行测试,设置请求为 POST,URL 为 http://localhost:8080/files/upload,并在表单数据中选择要上传的文件。

  3. 文件下载:

  4. 在浏览器中,直接访问 http://localhost:8080/files/download/{filename},替换 {filename} 为你上传的文件名。

总结

通过以上步骤,我们成功实现了一个基本的文件上传和下载功能。Spring Boot 使这项工作变得简单和高效。用户可以轻松扩展和定制这个功能,例如对上传文件的类型进行限制、为文件下载提供更复杂的逻辑等。希望这个示例能够帮助你快速入门!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部