java后端实现接收文件分片+断点续传


不得不说SpringBoot太好用了。

要求:

  • 前端传来文件的名字,切片的长度,切片的序列号,文件切片;
  • 构造一个对象用来接收传来的数据

img

img

拿到切片后就可以写文件的合并了,先说以下,前端传过来的数据是严格顺序,上一个切片没有写入,下一个是不会传过来的,详情可以去看我另一篇文章原生JS实现大文件分片 - 知乎 (zhihu.com)

先说一下想法:

  1. 判断切片的序列号是否为0,如果为零就以name的值为文件名创建文件。
  2. 如果不是序列号不为0就说文件已经存在,提取传入文件的字节流写入写入文件内。
 public void 单片写入(文件 file) throws IOException {
        File file1 ;

        MultipartFile meFile =file.getFile();// MultipartFile 这个类可以方便的获取前端传过来的文件
        file1=new File("C:\\Users\\laptop\\IdeaProjects\\file21510\\src\\main\\resources\\temp\\001\\"+file.getName());
        //filel获取文件,没有就创建
        if (!file1.exists()&&file.get切片序列()==0)//文件是否已经创建且文件是第一个保证文件的顺须
        {
            meFile.transferTo(file1);//如果没有就创建
             return;
        }
        else {//如果已经创建就合并
        RandomAccessFile raf = new RandomAccessFile(file1,"rw");
        // RandomAccessFile类所提供的发方法可以动态的操作文件,
       //这里创建一个可以操作不完整文件的对象

            
        raf.seek(file.get切片序列()*file.get切片长度());//seek(int n)从n处处理
            byte[] bytes = meFile.getBytes();//提区文件的字节流
            raf.write(bytes);//上面的seek方法已经把指针放在这里从这直接写入
              

          raf.close();//写入后关闭

        }

    }
}

上面就可以实现分片文件的接收合并了,重要的是MultipartFile,RandomAccessFile,这两个类。

断点续传

实现断点续传的构思

  1. 文件分片按顺序上传,上传第一个后文件名md5加密保存到rdis的key,value保存为上传的切片序列的大小,
  2. 然后下面每次保存成功就更新对应的value,保持最新的。
  3. 每一次接收时查询redis是否已经存在相同的key,如果相同就跳到保存的index的下一个保存

有了上面的代码只需要在构造一个连接redis的接口和实现类。

这是我想的,如果有什么错误,请大家指出


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM