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 '上传成功';
    }
}

代码解析:

  1. 大文件秒传:

    • @PostMapping('/upload'): 映射上传文件请求。
    • @RequestParam('file') MultipartFile file: 获取上传的文件对象。
    • 判断文件是否为空和是否已存在。
    • 使用 file.transferTo(dest) 将文件保存到指定路径。
  2. 分片上传:

    • @RequestParam('chunk') Integer chunk: 获取当前分片的序号。
    • @RequestParam('chunks') Integer chunks: 获取总的分片数量。
    • 保存分片文件到指定路径。
    • 判断是否所有分片都已上传,如果是,则合并所有分片文件。

注意:

  • 在实际开发中,需要根据业务需求进行调整,例如添加文件类型校验、存储路径配置等。
  • 为了提高上传效率,可以使用异步上传等技术。
  • 为了保证数据安全,可以使用数据库或缓存记录上传进度。

通过本文的代码示例和讲解,你应该已经掌握了 Spring Boot 实现大文件秒传和分片上传的基本步骤。希望对你有所帮助!

Spring Boot 实现大文件秒传和分片上传 - 代码详解

原文地址: https://www.cveoy.top/t/topic/nv7Z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录