在Spring Boot中实现文件上传和下载功能是一个常见的需求,可以通过几个简单的步骤来完成。下面来介绍一下如何实现文件上传和下载。
1. 添加依赖
首先,确保你的`pom.xml`文件中包含了Spring Boot的Web支持以及用于文件上传的库。通常,Spring Boot starter web已经足够,但你可能还需要添加一个额外的配置来支持文件上传。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 如果需要处理大文件上传,可以考虑添加以下依赖来提高性能 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <!-- 这个是可选的,如果你需要数据库操作的话 -->
</dependency>
</dependencies>
注意:对于大文件上传,Spring Boot 2.x以上版本推荐使用`spring-boot-starter-webflux`并配合多部分解析器处理大文件。
2. 配置文件上传
在`application.properties`或`application.yml`中,你可以配置文件上传的大小限制:
properties
# application.properties
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
3. 文件上传接口
创建一个Controller类,定义一个方法来处理文件上传请求。这里使用`MultipartFile`接收上传的文件。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@RestController
public class FileUploadController {
@Value("${upload.path}")
private String uploadPath;
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
try {
// 检查文件是否为空
if (file.isEmpty()) {
return "Please select a file to upload";
}
// 获取文件名
String fileName = file.getOriginalFilename();
// 构建文件存储路径
Path filePath = Paths.get(uploadPath, fileName);
// 保存文件到服务器
Files.copy(file.getInputStream(), filePath);
return "File uploaded successfully: " + fileName;
} catch (Exception e) {
e.printStackTrace();
return "Error occurred while uploading file: " + e.getMessage();
}
}
}
确保在`application.properties`中设置了文件上传的目录路径,如:
properties
upload.path=/path/to/upload/directory
4. 文件下载接口
同样地,定义一个方法来处理文件下载请求。
@GetMapping("/download/{fileName:.+}")
public ResponseEntity<Resource> downloadFile(@PathVariable String fileName, HttpServletResponse response) throws IOException {
Path filePath = Paths.get(uploadPath, fileName);
if (!Files.exists(filePath)) {
throw new FileNotFoundException("File not found " + fileName);
}
Resource resource = new UrlResource(filePath.toUri());
String contentType = null;
try {
contentType = Files.probeContentType(filePath);
} catch (IOException e) {
e.printStackTrace();
}
if (contentType == null) {
contentType = "application/octet-stream";
}
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(contentType))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
.body(resource);
}
这段代码会根据文件名从指定的目录下载文件,并设置正确的响应头以提示浏览器进行文件下载。
注意事项
- 确保应用具有对上传和下载目录的读写权限。
- 考虑安全性问题,避免直接暴露文件路径,防止恶意访问。
- 对于大型文件上传和下载,考虑使用异步处理或者流式处理来优化性能和资源使用。
以上就是使用Spring Boot实现文件上传和下载的基本示例。