大文件分断上传后端

1.构建类

java 复制代码
public class MultipartFileParam {
  // 用户id
    private String uid;
    //任务ID
    private String id;
    //总分片数量
    private int chunks;
    //当前为第几块分片
    private int chunk;
    //当前分片大小
    private long size = 0L;
    //文件名
    private String name;
    //分片对象
    private MultipartFile file;
    // MD5
    private String md5;
}

2.分断上传方法,

传入文件大小由前端指定,这个方法只负责保存分片文件

java 复制代码
	/**
	*保存分配图片
	**/
   public void uploadFile(MultipartFileParam param) {
         // 文件每次分片的下标
        int chunkIndex = param.getChunk();
        //将前端生成的md5创建成一个文件
           File file = new File(rootPath + File.separator + "dataFile" + File.separator + "temp" + File.separator + param.getMd5());
            if (!file.exists()) {
                file.mkdir();
            }
         //创建临时分片文件将 chunkIndex作为名称生成文件
            File chunkFile = new File(
                    rootPath + File.separator + "dataFile" + File.separator + "temp" + File.separator + param.getMd5() + File.separator + chunkIndex);
//将前端上传的数据保存到这个文件里面
FileUtils.copyInputStreamToFile(param.getFile().getInputStream(), chunkFile);
	}

3.合并方法

吧哪些分片文件合并成一个返回文件地址就行了

(还可以写一个检查的接口md5参数如果上传文件一样的话是一样的结果可以先判定一下直接返回)

java 复制代码
    public String mergeFile(String fileMd5,String fileName) {
            // 读取目录里的所有的分片文件
            File dir = new File(rootPath + File.separator + "dataFile" + 	File.separator + "temp" + File.separator + fileMd5);
            File[] childs = dir.listFiles();
            if (Objects.isNull(childs) || childs.length == 0) {
                return null;
            }
 // 转成集合,便于排序
            List<File> fileList = new ArrayList<File>(Arrays.asList(childs));
            Collections.sort(fileList, new Comparator<File>() {
                @Override
                public int compare(File o1, File o2) {
                    if (Integer.parseInt(o1.getName()) < Integer.parseInt(o2.getName())) {
                        return -1;
                    }
                    return 1;
                }
            });
                // 创建合并后的文件地址
            File outputFile = new File(rootPath + File.separator + "dataFile" + File.separator + "merge" + File.separator + fileMd5 + File.separator + fileName);
              // 创建文件
            if (!outputFile.exists()) {
                File mergeMd5Dir = new File(rootPath + File.separator + "dataFile" + File.separator + "merge" + File.separator + fileMd5);
                if (!mergeMd5Dir.exists()) {
                    mergeMd5Dir.mkdirs();
                }
                logger.info("创建文件");
                outputFile.createNewFile();
            }
}
相关推荐
李慕婉学姐5 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆7 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin7 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20057 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉7 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国8 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882488 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈8 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_998 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹8 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理