Bottle 是個輕量級的Web框架,小巧又強大,真不愧是個輕量級的框架。可擴展性很是好,能夠擴展不少功能,可是有些功能就不得不本身動手修改了。html
Bottle:http://www.bottlepy.org/docs/dev/tutorial.htmlgit
BaiduWebUpLoader 則是一個我認爲很是不錯的大文件上傳庫,兼容IE6,Flash和HTML5兩套自動選擇方案。詳情請閱讀他們的項目文檔。github
BaiduWebUpLoader:https://github.com/fex-team/webuploaderweb
BaiduWebUpLoader 能夠將大文件拆成 N 個小POST請求分段傳輸,傳輸過程當中有這些值:網絡
咱們將關鍵用到 chunk 值。固然了我建議你若是沒讀過webloader 的文檔仍是去讀讀。裏面有詳細的介紹,在這裏不在闡述。併發
因此咱們須要將 Bottle 框架修改爲,每次的POST大文件分段的時候自動合併成一個文件,可是也不能影響單/多小文件上傳。框架
首先閱讀Bottle 官方文檔能夠看到很簡單的文件上傳,相信這對於你而言並不難。函數
文件最後保存的時候是用 upload.save() 函數來進行保存的,記住這個函數,咱們要去修改它的源代碼。測試
咱們使用 request.files.gupet('upload_file') 既能夠獲得一個 FormsDict 對象,FormsDict對象是一羣 對象的集合, 由於你一次上傳並不可能只有一個文件,因此是有個集合的。編碼
如同:
咱們跟進 FileUpload 類,去看看他的定義。
這張圖只需明白。self.file 值是外界賦值的,這裏咱們無論。
再看下張圖,你會發現一個可喜之處。save函數就在這裏,咱們只須要進行更改就行了。
這裏是 save 函數的實現。註釋也說了各個參數的用法。
參數: 目的地 是否覆蓋 緩衝區大小
接下來咱們就須要更改這個 raise IOError('File exists.') ,由於只有這樣,咱們才能夠對已有的文件進行追加寫入,讓多個POST請求變成一個文件。
保證下次文件存儲的時候是能夠合併在一塊兒的,而不是覆蓋。
可是發現並無 POST數據,不能直接在這裏寫 with open(path,'ab') as fp,咱們得看看它是如何實現的;
因而咱們看看下面的 _copy_file 方法
看見這個函數,瞬間高興了,這不 IO 流都在這裏了嘛。這個函數將會每次從 POST 請求中讀一段文件數據到緩衝區,而後再寫到目標流。
看起來這個我是能夠直接利用的,只須要加一個 追加,不重寫就能夠,由於這裏的write 是open 返回的文件指針,是通用的。
因而咱們修改爲以下:
咱們建立一個 ab 模式的文件指針。而後利用現有的 _copy_file 函數就行了!
注意我加了個參數,section_upload,當爲True時表明追加寫入文件模式。
這樣咱們就實現了幾回文件POST包均可以合併(追加)成一個文件了。
可是還不止這樣就結束了,還記得最開始的POST裏面的 chunk 值嗎?當它等於0的時候,就是表明一個新的文件,因此咱們這樣就能夠避免重複追加。
若是不加這個判斷,就會形成,之後上傳只要文件名同樣,就會追加到現有的文件,因此咱們不能這樣。
有些地方是業務邏輯,你看着變量名理解就行了。
overwrite 是是否覆蓋,section_upload是我自定義的參數,表示追加模式。二者不可同時爲True
這樣,就能夠實現 結合webloader就能夠實現大文件上傳,而又也不用擔憂小文件會出錯。
不過你再使用以後,會發現一個奇異現象,就是任何上傳中文名字的文件,中文名都會過濾掉。
原先我覺得是編碼問題,後來再去翻翻源碼發現Bottle內部上傳文件名本身進行了過濾,因此若是你不須要這個功能的話,還得去掉。
若是你不須要這個功能,你還得本身去掉這些代碼。無視我那個註釋。
不過你就要本身提供文件名過濾了,對了,POST請求中 你也能夠用name的值。。
上傳測試:
咱們上傳這些文件,我相信足夠證實大文件可靠性。
這是個人 uploader 配置:
這裏更正一下,最大併發數能夠不爲1,修改後的依然支持多併發,由於咱們加了 chunk 的判斷。從而兼容。
可是我仍是建議爲1,由於會出現一些意想不到的事情,在真實的網絡中。
上傳結果:
所有上傳成功,而且沒有一個文件損壞。
不過我忘記加小文件和其餘格式文件了,我後來都測試過,所有正常。
單(多)小文件 Webloader 不會分段,而是直接POST,這個咱們修改以後的也能夠支持。
這樣小小的修改一下Bottle框架以後,咱們就能夠實現大文件上傳了,固然了是用的內置的HTTP服務。
若是搭配Apache的話就另外說了,不過我看了下代碼應該也須要這樣改。
沒有在真實網絡測試,之後有機會加上。目前尚未試過,webloader 文檔介紹會自動重傳丟失部分;
可是我不能保證若是是POST傳輸文件數據的時候到一半斷掉,或者漏了幾個字節,而後原先已經寫入數據卻不能反悔了。
將會致使即便重傳上傳後追加的文件損壞。