不得不说SpringBoot太好用了。
要求:
- 前端传来文件的名字,切片的长度,切片的序列号,文件切片;
- 构造一个对象用来接收传来的数据
拿到切片后就可以写文件的合并了,先说以下,前端传过来的数据是严格顺序,上一个切片没有写入,下一个是不会传过来的,详情可以去看我另一篇文章原生JS实现大文件分片 - 知乎 (zhihu.com)
先说一下想法:
- 判断切片的序列号是否为0,如果为零就以name的值为文件名创建文件。
- 如果不是序列号不为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,这两个类。
断点续传
实现断点续传的构思
- 文件分片按顺序上传,上传第一个后文件名md5加密保存到rdis的key,value保存为上传的切片序列的大小,
- 然后下面每次保存成功就更新对应的value,保持最新的。
- 每一次接收时查询redis是否已经存在相同的key,如果相同就跳到保存的index的下一个保存
有了上面的代码只需要在构造一个连接redis的接口和实现类。
这是我想的,如果有什么错误,请大家指出