大文件分断上传后端

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();
            }
}
相关推荐
stein_java1 小时前
springMVC-10验证及国际化
java·spring
weixin_478689761 小时前
C++ 对 C 的兼容性
java·c语言·c++
LUCIAZZZ1 小时前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
sky_ph2 小时前
JAVA-GC浅析(二)G1(Garbage First)回收器
java·后端
IDRSolutions_CN2 小时前
PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第二部分)
java·经验分享·pdf·软件工程·团队开发
hello早上好2 小时前
Spring不同类型的ApplicationContext的创建方式
java·后端·架构
HelloWord~3 小时前
SpringSecurity+vue通用权限系统2
java·vue.js
让我上个超影吧3 小时前
黑马点评【基于redis实现共享session登录】
java·redis
BillKu4 小时前
Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
java·tomcat·mybatis
全栈凯哥4 小时前
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
java·算法·leetcode·链表