Spring Boot 实现大文件秒传和分片上传 - 代码详解
Spring Boot 实现大文件秒传和分片上传 - 代码详解
本文将带你深入了解 Spring Boot 如何实现大文件秒传和分片上传,并提供完整示例代码。从判断文件是否存在、保存文件到合并分片文件,每个步骤都有详细说明,帮助你快速掌握大文件上传技术。
1. 大文件秒传
@Controller
public class FileController {
@PostMapping('/upload')
@ResponseBody
public String upload(@RequestParam('file') MultipartFile file) {
// 判断文件是否存在
if (file.isEmpty()) {
return '文件为空';
}
// 判断文件是否已存在
String fileName = file.getOriginalFilename();
File dest = new File(fileName);
if (dest.exists()) {
return '文件已存在';
}
// 保存文件
try {
file.transferTo(dest);
} catch (IOException e) {
e.printStackTrace();
return '上传失败';
}
return '上传成功';
}
}
2. 分片上传
@Controller
public class FileController {
@PostMapping('/upload')
@ResponseBody
public String upload(@RequestParam('file') MultipartFile file,
@RequestParam('chunk') Integer chunk,
@RequestParam('chunks') Integer chunks) {
// 保存分片文件
String fileName = file.getOriginalFilename();
String filePath = 'upload/' + fileName;
File dest = new File(filePath);
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
try (FileOutputStream fos = new FileOutputStream(dest, true);
InputStream is = file.getInputStream()) {
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
return '上传失败';
}
// 判断是否上传完成
if (chunk.equals(chunks - 1)) {
// 合并文件
File mergeFile = new File(filePath);
for (int i = 0; i < chunks; i++) {
File partFile = new File('upload/' + fileName + '.part' + i);
try (FileInputStream fis = new FileInputStream(partFile);
OutputStream os = new FileOutputStream(mergeFile, true)) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
return '上传失败';
}
partFile.delete();
}
}
return '上传成功';
}
}
代码解析:
-
大文件秒传:
@PostMapping('/upload'): 映射上传文件请求。@RequestParam('file') MultipartFile file: 获取上传的文件对象。- 判断文件是否为空和是否已存在。
- 使用
file.transferTo(dest)将文件保存到指定路径。
-
分片上传:
@RequestParam('chunk') Integer chunk: 获取当前分片的序号。@RequestParam('chunks') Integer chunks: 获取总的分片数量。- 保存分片文件到指定路径。
- 判断是否所有分片都已上传,如果是,则合并所有分片文件。
注意:
- 在实际开发中,需要根据业务需求进行调整,例如添加文件类型校验、存储路径配置等。
- 为了提高上传效率,可以使用异步上传等技术。
- 为了保证数据安全,可以使用数据库或缓存记录上传进度。
通过本文的代码示例和讲解,你应该已经掌握了 Spring Boot 实现大文件秒传和分片上传的基本步骤。希望对你有所帮助!
原文地址: https://www.cveoy.top/t/topic/nv7Z 著作权归作者所有。请勿转载和采集!