在Spring Boot项目中实现文件的上传、下载和预览功能,可以通过使用Spring MVC的MultipartFile
接口来处理文件上传,并使用HttpServletResponse
或Resource
来实现文件下载和预览。下面是如何实现这些功能的完整示例。
1. 引入依赖
确保在pom.xml
中引入了Spring Boot的相关依赖。通常情况下,Spring Boot Starter Web已经包含了必要的依赖。
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 创建文件上传、下载和预览的Controller
你可以创建一个FileController
来处理文件的上传、下载和预览。
java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
@Controller
@RequestMapping("/files")
public class FileController {
// 文件保存路径(可以通过配置文件进行配置)
@Value("${file.upload-dir}")
private String fileUploadDir;
// 文件上传
@PostMapping("/upload")
@ResponseBody
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
// 获取文件名并且保存文件
String fileName = file.getOriginalFilename();
Path targetLocation = Paths.get(fileUploadDir).resolve(fileName);
Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
// 返回文件下载的URL
String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
.path("/files/download/")
.path(fileName)
.toUriString();
return "File uploaded successfully: " + fileDownloadUri;
}
// 文件下载
@GetMapping("/download/{fileName}")
public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) throws MalformedURLException {
Path filePath = Paths.get(fileUploadDir).resolve(fileName).normalize();
Resource resource = new UrlResource(filePath.toUri());
if (!resource.exists()) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
.body(resource);
}
// 文件预览(主要针对图片、PDF等可以直接在浏览器中显示的文件)
@GetMapping("/preview/{fileName}")
public ResponseEntity<Resource> previewFile(@PathVariable String fileName) throws MalformedURLException {
Path filePath = Paths.get(fileUploadDir).resolve(fileName).normalize();
Resource resource = new UrlResource(filePath.toUri());
if (!resource.exists()) {
return ResponseEntity.notFound().build();
}
String contentType = "application/octet-stream";
try {
contentType = Files.probeContentType(filePath);
} catch (IOException e) {
e.printStackTrace();
}
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(contentType))
.body(resource);
}
}
3. 配置文件上传目录
在application.properties
或application.yml
中配置文件的上传路径:
bash
file.upload-dir=C:/uploads
或者使用application.yml
:
bash
file:
upload-dir: C:/uploads
你可以将路径配置为你项目的目录,也可以指定到服务器的某个位置。
4. 创建上传目录
确保在你的系统上已经创建了配置文件中指定的上传目录,比如C:/uploads
。如果没有创建,可以通过代码在项目启动时自动创建:
java
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@Component
public class FileUploadDirectoryInitializer implements CommandLineRunner {
@Value("${file.upload-dir}")
private String fileUploadDir;
@Override
public void run(String... args) throws Exception {
Path uploadPath = Paths.get(fileUploadDir);
if (!Files.exists(uploadPath)) {
Files.createDirectories(uploadPath);
}
}
}
5. 测试上传、下载和预览
5.1 文件上传
你可以使用Postman、cURL或者前端页面来测试文件上传功能。上传文件的URL为:
bash
POST http://localhost:8080/files/upload
参数名称为file
。
5.2 文件下载
你可以通过以下URL下载文件:
bash
GET http://localhost:8080/files/download/{fileName}
其中{fileName}
是文件的名称。
5.3 文件预览
你可以通过以下URL预览文件(如图片或PDF):
bash
GET http://localhost:8080/files/preview/{fileName}
6. 处理大文件上传
对于大文件上传,Spring Boot默认的最大上传文件大小可能不满足需求,可以通过以下配置进行调整:
bash
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
或者在application.yml
中:
Lua
spring:
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
7. 文件预览类型支持
通常情况下,浏览器支持预览的文件类型包括图片(如jpeg
、png
)、PDF、文本文件等。如果文件类型不被浏览器支持,通常可以通过文件下载的方式处理。
8. 文件删除功能(可选)
你也可以添加一个删除文件的接口,来删除已上传的文件:
java
// 文件删除
@DeleteMapping("/delete/{fileName}")
@ResponseBody
public String deleteFile(@PathVariable String fileName) throws IOException {
Path filePath = Paths.get(fileUploadDir).resolve(fileName).normalize();
Files.deleteIfExists(filePath);
return "File deleted successfully";
}