大文件分断上传后端

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();
            }
}
相关推荐
铁蛋AI编程实战17 分钟前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘28 分钟前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays101130 分钟前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
摇滚侠41 分钟前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.1 小时前
java多态
java·开发语言·c++
李堇1 小时前
android滚动列表VerticalRollingTextView
android·java
泉-java1 小时前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
zfoo-framework2 小时前
帧同步和状态同步
java
charlotte102410242 小时前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
亓才孓2 小时前
[JDBC]PreparedStatement替代Statement
java·数据库