下面我将针对“spring boot实现图片上传和下载功能”的完整操作过程进行详细讲解,并提供两个示例以供参考。
准备工作
在开始实现图片上传和下载功能之前,我们需要先准备好开发环境和所需要的依赖。具体流程如下:
环境搭建
- JDK 1.8及以上版本
- Maven 3.2及以上版本
- IDE开发工具(如Eclipse、IntelliJ IDEA等)
需要依赖
在Maven项目的pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.3.9.RELEASE</version>
</dependency>
同时,为了让程序能够上传和下载文件,还需要引入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
实现图片上传和下载功能
实现图片上传
- 创建上传文件的Controller类,并添加上传文件页面。
@Controller
public class FileUploadController {
@GetMapping("/")
public String index() {
return "upload";
}
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, Model model) throws IOException {
FileUtils.writeByteArrayToFile(new File("D://" + file.getOriginalFilename()), file.getBytes());
model.addAttribute("msg", "File uploaded successfully");
return "upload_status";
}
}
其中,/
是上传文件的页面路径,upload
是上传文件的页面名称,/upload
是上传文件的处理路径,upload_status
是处理上传结果的页面名称。
- 创建上传页面upload.html。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>File Upload</title>
</head>
<body>
<div>
<form method="POST" enctype="multipart/form-data" th:action="@{/upload}">
<input type="file" name="file" />
<button type="submit">Submit</button>
</form>
</div>
</body>
</html>
- 创建上传结果页面upload_status.html。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>File Upload Status</title>
</head>
<body>
<h1 th:text="${msg}"></h1>
</body>
</html>
实现图片下载
- 创建实体类File。
@Entity
public class File {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String path;
private String type;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
- 创建文件上传和下载服务类FileService。
@Service
public class FileService {
@Autowired
private FileRepository fileRepository;
public void upload(MultipartFile file) throws Exception {
String path = "D://";
String name = file.getOriginalFilename();
File f = new File();
f.setName(name);
f.setPath(path);
f.setType(file.getContentType());
FileUtils.writeByteArrayToFile(new File(path + name), file.getBytes());
fileRepository.save(f);
}
public ResponseEntity<Resource> download(Long id) throws Exception {
Optional<File> optional = fileRepository.findById(id);
if (optional.isPresent()) {
File f = optional.get();
InputStreamResource resource = new InputStreamResource(new FileInputStream(new File(f.getPath() + f.getName())));
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_TYPE, f.getType())
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + f.getName() + "\"")
.body(resource);
}
throw new Exception("File not found.");
}
}
其中,FileRepository
是用于声明和操作实体类File
的数据库操作类。
- 创建上传文件处理器和下载文件处理器。
@Controller
public class FileController {
@Autowired
private FileService fileService;
@GetMapping("/download/{id}")
public ResponseEntity<Resource> download(@PathVariable Long id) throws Exception {
return fileService.download(id);
}
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, Model model) throws Exception {
fileService.upload(file);
model.addAttribute("msg", "File uploaded successfully");
return "upload_status";
}
}
其中,/download/{id}
是下载文件的处理路径,/upload
是上传文件的处理路径。
- 创建下载文件页面download.html。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>File Download</title>
</head>
<body>
<div>
<h1>File Download</h1>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Action</th>
</tr>
<tr th:each="file : ${files}">
<td th:text="${file.id}"></td>
<td th:text="${file.name}"></td>
<td><a th:href="@{/download/{id}(id=${file.id})}">Download</a></td>
</tr>
</table>
</div>
</body>
</html>
总结
通过以上步骤,我们已经成功实现了基于Spring Boot框架的图片上传和下载功能。在实际应用中,我们可以根据自己的需求进行相应的定制和优化。同时,对于初学者而言,以上代码可以作为一个基础模板,供大家参考和学习。
示例代码1:https://github.com/ljw104925/spring-boot-file-upload-download
示例代码2:https://github.com/whvcse/FileUpDown-SpringBoot
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot实现图片上传和下载功能 - Python技术站