概述
項目中需要一個上傳200M-500M的文件大小的功能,需要斷點續傳、上傳性能穩定、突破asp.net上傳限制。一開始看到51CTO上的這篇文章,此方法確實很不錯,能夠穩定的上傳大文件,http://developer.51cto.com/art/201002/183218_1.htm,但是很遺憾的是由於我技術不精湛,無法修改成能夠支持斷點續傳。然后在網上找了很多資料,但是都無法滿足我的功能,有些說要ftp,有些說要是Silverlight,都有很多說辭,我也試過很多方法,下載過很多代碼,但那都不是我想要的。我想要的是一個簡單,功能又齊全的大文件上傳功能。
- 只想用http協議,不想走FTP協議
- 只想上傳大文件,不想受ASP.NET 2G大小限制
- 不想購買一些付費的上傳組件
- 上傳過程中能夠刪除文件
- 上傳過程中能夠顯示進度條
- 上傳過程中能夠暫停上傳
- 上傳過程中出現異常,能夠接着上傳(斷點續傳)
如果你想滿足上述功能,或者想擴展更多功能。你就往下看
在網上找案例、方法期間在一篇文章中給了我很大的啟發。
- http://open.dbank.com/wiki/index.php?title=%E6%95%B0%E6%8D%AE%E4%B8%8A%E4%BC%A0 里面的Range屬性。
- http://www.cnblogs.com/ASPNET2008/p/3360427.html 里面的分塊上傳,雖然作者也寫了斷點續傳代碼,但是通過我的測試與研究發現,他的代碼並沒有真正意義上的斷點續傳,他只是將已經上傳的那部分文件流舍棄掉,然后等上傳到了那塊位置的時候才開始附加到磁盤文件,這樣並沒有提高上傳效率,我的代碼就是在他的代碼上稍作修改的結果
最終效果圖
大文件上傳
大文件上傳我也不想多說。本文及案例重點是斷點續傳。大文件上傳有很多上傳案例,而且都非常不錯,也非常成熟。可以google一大把。
斷點續傳
此方法經測試壓縮文件似乎會出現問題
在提前研究這功能期間,一直都有一個思路就是:假如我上傳了100M,突然有斷網等異常情況,那我下次上傳就應該從磁盤文件的最后位置開始上傳。
上述思路應該是沒有問題的,可是在解決這個問題的時候總是困難重重,服務器端不能直接讀取客戶端文件,也不能直接要求客戶端從什么位置開始讀。
然后知道Jquery里面有一款插件叫Jquery File Upload,也就是上面寫斷點續傳哥們用到的插件,它能夠對文件進行分塊上傳,也就是說每次上傳只是上傳文件的一部分,就像我們.Net操作文件流一樣,讀取文件的一部分字節。
首先看Jquery File Upload分塊后正常情況的報文
請求時發送一個字節區間。我就在響應報文頭里面加了一個Range屬性,告訴Jquery File upload我當前處理的位置是多少。雖然我到目前都沒明白Jquery File Upload是怎么實現的,但是我這樣做確實能夠讓它下次上傳同一個文件時它會幫我處理。
由於個人原因,也無法描述的更加好,把源代碼貼上供大家下載,希望能夠有更好的解決方案出現,也希望能夠給大家一點啟發與幫助。謝謝