在现代 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 应用程序并测试文件上传和下载。以下是常用的测试方式:
- 文件上传:
-
使用 Postman 进行测试,设置请求为
POST
,URL 为http://localhost:8080/files/upload
,并在表单数据中选择要上传的文件。 -
文件下载:
- 在浏览器中,直接访问
http://localhost:8080/files/download/{filename}
,替换{filename}
为你上传的文件名。
总结
通过以上步骤,我们成功实现了一个基本的文件上传和下载功能。Spring Boot 使这项工作变得简单和高效。用户可以轻松扩展和定制这个功能,例如对上传文件的类型进行限制、为文件下载提供更复杂的逻辑等。希望这个示例能够帮助你快速入门!