下面我将详细讲解SpringBoot项目的多文件兼多线程上传下载的完整攻略。
1. 多文件上传
1.1 前端页面实现
第一步是实现前端页面,让用户可以选择并上传多个文件。在html文件中,使用<input type="file" multiple>
标签实现多个文件上传,代码如下:
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file" multiple>
<input type="submit" value="上传">
</form>
1.2 后端实现
第二步是实现后端代码,将上传的多个文件保存至目标目录。这里我们采用SpringBoot框架提供的MultipartFile
来处理文件上传。
首先需要在Controller中添加上传接口的请求映射注解@PostMapping("/upload")
,并使用@RequestParam("file") MultipartFile[] files
来接收上传的文件数组。接着使用file.transferTo(new File(fileFullPath))
来将上传的文件保存至目标目录,完整代码如下:
@RestController
public class FileController {
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile[] files) {
for (MultipartFile file : files) {
String filename = file.getOriginalFilename();
if (!file.isEmpty()) {
String fileFullPath = "目标保存目录/" + filename;
try {
file.transferTo(new File(fileFullPath));
} catch (IOException e) {
e.printStackTrace();
return "上传失败";
}
}
}
return "上传成功";
}
}
2. 多文件下载
2.1 前端页面实现
第一步是实现前端页面,让用户可以选择并下载多个文件。在html文件中,使用<a href="/download?filename=文件1&filename=文件2">下载</a>
标签,将要下载的文件名通过url参数传递给后端。
2.2 后端实现
第二步是实现后端代码,将客户端请求参数中所包含的多个文件下载到客户端本地。这里我们采用SpringBoot框架提供的ResponseEntity
来处理文件下载。首先需要在Controller中添加下载接口的请求映射注解@GetMapping("/download")
,并使用@RequestParam("filename") List<String> filenames
来接收客户端请求参数中所包含的多个文件名。
接着,根据每个文件名拼接出其完整路径,并使用responseEntity.ok().headers(...).contentLength(...).contentType(MediaType.parseMediaType(...)).body(...)
将文件传输至客户端。完整代码如下:
@RestController
public class FileController {
@GetMapping("/download")
public ResponseEntity<byte[]> download(@RequestParam("filename") List<String> filenames) {
List<File> files = new ArrayList<>();
for (String filename : filenames) {
String fileFullPath = "目标文件目录/" + filename;
File file = new File(fileFullPath);
if (file.exists()) {
files.add(file);
}
}
byte[] data = new byte[0];
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 将多个文件合并为一个zip压缩文件
ZipOutputStream zipOutputStream = new ZipOutputStream(out);
for (File file : files) {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) != -1) {
zipOutputStream.write(buffer, 0, len);
}
in.close();
}
zipOutputStream.closeEntry();
zipOutputStream.close();
data = out.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
HttpHeaders headers = new HttpHeaders();
headers.setContentDispositionFormData("attachment", "files.zip");
headers.setContentType(MediaType.parseMediaType("application/zip"));
headers.setContentLength(data.length);
return ResponseEntity.ok().headers(headers).body(data);
}
}
3. 多线程上传/下载优化
为了提高上传下载的性能,我们可以使用多线程来加速传输。这里我们采用Java的ExecutorService
来实现多线程。以下是上传多个文件时的示例代码。
@RestController
public class FileController {
private static final int THREAD_POOL_SIZE = 5;
@PostMapping("/upload/multithreaded")
public String uploadMultithreaded(@RequestParam("file") MultipartFile[] files) throws InterruptedException {
ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
CountDownLatch countDownLatch = new CountDownLatch(files.length);
// 将上传任务分配给线程池执行
for (MultipartFile file : files) {
threadPool.execute(() -> {
String filename = file.getOriginalFilename();
if (!file.isEmpty()) {
String fileFullPath = "目标保存目录/" + filename;
try {
file.transferTo(new File(fileFullPath));
} catch (IOException e) {
e.printStackTrace();
}
}
countDownLatch.countDown();
});
}
// 等待所有上传任务完成
countDownLatch.await();
// 关闭线程池
threadPool.shutdown();
return "上传成功";
}
}
对于多文件下载,使用多线程方式下载的核心思想与多线程上传类似,这里不再赘述。
至此,我们就完成了SpringBoot项目的多文件兼多线程上传下载的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot项目的多文件兼多线程上传下载 - Python技术站