不得不說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的接口和實現類。
這是我想的,如果有什么錯誤,請大家指出