在前面的文章中,我们介绍了如何在Spring Boot中实现单个文件的上传和下载。但是,有时候我们需要实现多个文件的上传和批量下载,本文将介绍如何在Spring Boot中实现多文件上传和批量下载的功能。
多文件上传
在Spring Boot中,实现多文件上传与单文件上传类似,主要区别在于前端表单中需要使用多个文件输入框,并且在后端Controller中需要使用MultipartFile数组来接收多个文件。下面是一个示例代码:
Controller
@Controller
public class MultipleFileUploadController {
@PostMapping("/multiple-upload")
public String multipleUpload(@RequestParam("file") MultipartFile[] files, RedirectAttributes redirectAttributes) {
for (MultipartFile file : files) {
if (file.isEmpty()) {
redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
return "redirect:multiple-upload";
}
try {
// 保存文件
byte[] bytes = file.getBytes();
Path path = Paths.get("/tmp/" + file.getOriginalFilename());
Files.write(path, bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
redirectAttributes.addFlashAttribute("message", "You successfullyuploaded " + files.length + " files");
return "redirect:multiple-upload";
}
}
在上面的代码中,我们使用@RequestParam注解来接收前端传递过来的MultipartFile数组。然后,我们遍历数组中的每个文件,检查其是否为空。如果文件为空,我们将返回上传表单页面,并显示错误消息。如果文件上传成功,我们将重定向到上传表单页面,并显示成功消息。
模板
为了实现多文件上传,我们需要在前端表单中使用多个文件输入框。下面是一个使用Thymeleaf的HTML文件示例:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Multiple File Upload</title>
</head>
<body>
<div th:if="${message}" class="alert alert-success" th:text="${message}"></div>
<form method="post" enctype="multipart/form-data" th:action="@{/multiple-upload}">
<div class="form-group">
<label for="file">Select files to upload:</label>
<input type="file" id="file" name="file" multiple>
</div>
<button type="submit" class="btn btn-primary">Upload</button>
</form>
</body>
</html>
在上面的代码中,我们使用Thymeleaf的multiple属性指定文件输入框可以选择多个文件。
批量下载
在Spring Boot中实现批量下载,我们可以使用ZipOutputStream将多个文件打包成一个压缩文件,然后将该压缩文件发送给浏览器。下面是一个示例代码:
Controller
@Controller
public class BatchFileDownloadController {
@GetMapping("/batch-download")
public void batchDownload(HttpServletResponse response) throws IOException {
// 获取要下载的文件列表
List<File> files = new ArrayList<>();
files.add(new File("/tmp/file1.txt"));
files.add(new File("/tmp/file2.txt"));
files.add(new File("/tmp/file3.txt"));
// 设置响应头信息
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=batch-download.zip");
// 创建ZipOutputStream
ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
// 将文件添加到压缩包中
for (File file : files) {
zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
FileInputStream fileInputStream = new FileInputStream(file);
IOUtils.copy(fileInputStream, zipOutputStream);
fileInputStream.close();
zipOutputStream.closeEntry ();
}
// 关闭ZipOutputStream
zipOutputStream.close();
}
}
在上面的代码中,我们首先获取要下载的文件列表,然后设置响应头信息,创建ZipOutputStream并将文件添加到压缩包中。最后,我们关闭ZipOutputStream并将压缩文件发送给浏览器。
模板
为了实现批量下载,我们可以在前端页面中添加一个链接或按钮,该链接或按钮将触发文件批量下载。下面是一个使用Thymeleaf的HTML文件示例:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Batch File Download</title>
</head>
<body>
<a th:href="@{/batch-download}" class="btn btn-primary">Download Files</a>
</body>
</html>
在上面的代码中,我们使用Thymeleaf的href属性指定批量下载的URL,这里指向/batch-download。
总结
在本文中,我们介绍了如何在Spring Boot中实现多文件上传和批量下载的功能。在实现多文件上传时,我们需要使用MultipartFile数组来接收多个文件,并在前端表单中使用多个文件输入框。在实现批量下载时,我们可以使用ZipOutputStream将多个文件打包成一个压缩文件,并将该压缩文件发送给浏览器。Spring Boot提供了简单且易于使用的方式来实现多文件上传和批量下载,这对于许多Web应用程序来说是非常重要的功能。在实现多文件上传和批量下载时,需要注意安全性和文件大小的限制,并根据实际需求进行相应的配置。