Web支持可暫停的超大文件上傳

代碼鎮頂:https://github.com/dna2github/petalJS/blob/master/upload


前些天遇到用戶需要上傳10GB大小以上的文件的需求,查查網上的庫,都不好用。都沒有一個完整的前後端的例子,要麼像resumable.js只有前端,後端寫得無比麻煩。要麼是jquery file uploader封裝得太完整,想改就很麻煩。懶人就自己寫個小而易懂大家都可以用的東西吧。

代碼支持IE 10+, Opera, Chrome, Firefox, Safari, 在Android 4.2以上的默認瀏覽器貌似都能順利運行。js代碼也就80行左右,錯誤處理留空。


代碼下載後, python manage.py runserver,然後瀏覽器裏輸入 http://127.0.0.1:8000/static/index.html就可以使用了。

代碼js部分就是使用HTML5的Blob將文件分片,然後逐個POST。

爲了保證傳輸效率,就是讓整個POST請求除了HTML的Header外,都用binary形式上傳。如果再配合新的API,比如後端寫一個open file的API(e.g. /open),返回一個hash,然後用hash作爲URL,上傳文件data的時候(e.g. /upload/:hash)就往指定文件裏寫數據就好了,最後使用完調用close file的API(e.g. /close/:hash)。測試了下,在單機狀態下,傳了2.6GB的文件用了77秒,大概30MB/s,差不多是硬盤的讀寫速度了吧。

想要實現暫停和恢復,在event_reader_loadend裏使用個flag就可以了,暫停的時候設置flag爲true,在上傳blob成功的時候如果flag爲true就跳出停止;當按恢復的時候,繼續從暫停的地方按文件偏移讀取文件blob。

想要達到更好的傳輸速度,就在uploadFile裏的step上下文章就好了,通過統計沒傳一個blob所用的時間,動態調整step的大小,就是文件blob的大小。

要是遇到服務器錯誤或者用戶不小心刷新了頁面,就是另外的case了,這裏就是簡單說一下,使用file_name, file_size和file_md5是可以在即使頁面刷新的情況下繼續上傳文件。支持斷點下載也是外話,讀下Content-Range實現下206返回就好了。Enjoy :D

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章