寫在前面
最近一直在弄文件傳輸的組件,在討論組里面,有同事提到“秒傳”的功能。在目前的通信軟件中也有網盤的功能,就從網上搜了一下,這里對“秒傳”的實現思路做一下總結,在之后會寫一個小的demo實現一下。沒有其他,只為覺得好玩。
秒傳
其實知道原理了,實現起來也很簡單了。
秒傳是一種在網盤上常見的“忽略式”上傳方式,就是您上傳了一個文件名為111.exe,MD5為一個數,有一個網友以前也上傳一個叫111.exe,MD5和您上傳的文件MD5碼一模一樣,所以這個文件上傳到服務器上的時間就很短了,這是因為別人上傳過這個文件,您上傳這個文件,服務器上有這個文件了,所以服務器發放給你一個文件訪問地址就行了!
上傳到網盤的每個文件,服務器都會校驗MD5碼。如果這個您上傳的文件MD5碼與已經存在於服務器里的文件的MD5碼相同的話,網盤服務器將會判斷成為重復文件,只需要復制副本保存在網盤上即可,無需重新保存,因為有過這個文件,於是很快完成上傳任務,並在有人需要下載的時候將原有的該文件的下載地址放出。這樣實現了服務器的高效運作。
把你要上傳的東西壓縮成RAR,東西上傳,服務器會先做MD5校驗,如果服務器上有一樣的東西,它就直接給你個新地址,其實你下載的都是服務器上的同一個文件,想要不秒傳,其實只要讓MD5改變,就是對文件本身做一下修改(改名字不行),例如一個文本文件,你多加幾個字,MD5就變了,就不會秒傳了。但是有些文件我們不好改變,也不想改變,那其實只要壓縮一下,MD5就變了,而下載的人也能獲得最原始的資料,不過就是加壓要花費一點時間。----百度百科
畫一個簡單的模型:
當然,服務器端是默認接收文件的,接收的時候,就要判斷該md5是否已經存在,如果存在則說明存在該文件,則向客戶端發送一個命令,說明文件已經存在,則客戶端不必再發送后續的文件包。
總結
其實當你知道,什么是秒傳的時候,實現起來並不太難,你使用wcf也好,開源的superscoket也好,服務器端總歸能弄好的。在后面,將使用wcf做一個簡單的例子。還是那句話,只是覺得好玩。 這里記錄一下“秒傳”的實現思路,也算是對網盤秒傳功能的一個簡單的預研。