上傳基本上是這樣的:html
1. 首先傳送目標文件的工程分類、路徑和名稱,以及文件的md5散列值。linux
2. 若是服務器端發現已經有此文件,而且md5一致,返回「成功」。不然,若是存在此文件,可是md5不一致,服務器
返回「須要上傳」。不然,若是沒有此文件,查找之前的與此md5相同的文件的快照,拷貝成目標文件,多線程
返回「成功」。若是都失敗,返回「須要上傳」。併發
3. 客戶端若是收到「須要上傳」消息,開始分塊(好比說1M字節爲一塊)上傳。具體是:
a. 首先發消息讓服務器檢此數據塊的md5,若是客戶端跟跟服務一致,跳過此塊。
b. 若是不一致,發送此塊數據到服務器,覆蓋服務器端文件文件數據塊。
c. 按照上述a和b兩點,繼續處理餘下的數據塊。
d. 最後把服務器端文件的長度「修剪」成跟客戶端文件同樣長。.net
注意:客戶端上傳文件是併發多線程的,只是每個文件的上傳過程內部流程是順序的線程
參考資料:https://www.cnblogs.com/gaocong/p/5512371.htmlhtm
http://www.jb51.net/article/80658.htmblog
https://www.cnblogs.com/qianxiaojinnian/p/4731884.htmlmd5
http://www.jb51.net/article/80732.htm
http://www.jb51.net/article/111463.htm
https://www.linuxidc.com/Linux/2014-09/106816.htm
https://blog.csdn.net/yu18352566889/article/details/78499072