相信很多開發者,都做過文件上傳的功能。簡單的文件上傳很容易,在PHP里兩個函數就能搞定:
第一個函數判斷文件是否存在,第二個函數上傳文件。
但是如果上傳的文件有幾百M或幾個G的時候,這樣簡單操作可能就不靈了,可能會出現timeout或內存溢出的情況。
之所以會這樣,是因為上傳文件時服務器是先將文件內容保存在內存中,然后才保存到文件中。另外,服務器對單次上傳請求有時間和內存的限制,內存耗盡或時間超時,上傳請求會被終止。雖然這兩個值也是可以調整的,但是由于實際上傳的文件是未知的,所以你也不確定多大的值是合適的。另外,如果內存限制設置得太大,時間設置太長,當你上傳一個大文件時,有可能會將服務器內存耗盡,拖垮整個服務。
當然是從這前面說到的兩個原因著手!既然是因為文件太大,才導致請求耗時太長,內存占用太大,那我們可以將大文件分割成一個個小文件上傳,也就是采用分片上傳。
首先是前端將大文件分片上傳,然后是后端將所有分片按順序合并起來。如下:
前端分片我們可以使用webuploader.js組件,后端我們直接用Laravel框架即可。使用webuploader進行分片上傳很簡單,只需要配置幾個參數即可,如下:
其中,chunked表示是否開啟分片上傳;chunkSize表示分片的大小,單位字節;threads表示并發量。這里需要注意的是由于計算文件的md5值需要一定的時間,所以這里沒有使用自動上傳,而是將選擇文件和上傳分成了兩步。
后端部分需要接收file、chunks、chunk、md5、size幾個參數,其中md5用于判斷文件的唯一性,chunks、size用于判斷分片是否上傳完畢,如下:
這里也有一點需要注意,那就是服務端合并文件的時候最好使用stream_copy_to_stream進行流式操作,而不要直接file_put_contents。因為流式操作是一點點的合并的,不需要把全部的內容放在內存里,這樣可以避免在合并分片的時候內存溢出。
另外,考慮到分片上傳有可能存在部分成功的情況,因此,需要設置一個定時任務用于清除臨時文件,以減少服務器的資源浪費。如下:
如此,大文件上傳的問題就解決了。
雖然,這里使用PHP做服務端的演示,但是使用Java、Golang,依然可以參考本案例,因為原理基本一樣。
做為使用人數最多的Windows系統,大家應該是再熟悉不過,雖然大家都用了很多年,但其中隱藏著非常多的小功能,或許用了這么久電腦的你并沒有發現,現在小編就帶大家看看這些功能吧~
1.虛擬桌面
虛擬桌面功能是Win10才加入的新功能,這個功能只能用強大來形容,它可以新建一個和當前一摸一樣的桌面,然后可以在不同的桌面運行不同的應用。比如說,我們當前的桌面可以用來辦公,而另一個桌面可以進行娛樂、游戲,一鍵切換,簡直就是摸魚人必備的小技巧。
使用方法也非常簡單,使用組合鍵“Win+Tab”打開任務視窗,然后點擊新建桌面,然后通過“Win+Ctrl+←/→”來回切換桌面,通過“Win+Ctrl+F4”刪除當前虛擬桌面。
2.就近共享
傳文件應該是小伙伴們最常用的功能了,可能大家平時都是使用某聊天軟件發送文件,但卻發現傳文件的大小有限制,想要傳大文件還要開會員,又比如找陌生人傳文件時被迫加好友,那這個時候,共享功能就派上用場了。
“就近共享”是通過藍牙或WLAN與附近的電腦共享資料,使用時只需要在文件處右擊,選擇“共享”,就可以發送給周邊電腦,還不會被限速!
不過這項功能同樣也需要雙方使用Win10系統,或許這就是很多小伙伴不知道它的主要原因吧。
3.剪貼板
我們都知道有復制粘貼這個操作,但是你可能不知道win10有個“剪貼板”功能,可以保存復制過的內容,還能保留圖片等。
操作方法也很簡單,同時【Win】+【V】組合快捷鍵就可以調出剪貼板的窗口了。
4.步驟記錄器
Win10自帶的步驟記錄工具,可以自動記錄所有的操作內容自動生成圖片,以及附上每一步的操作說明,在寫教程時可以用上。
在運行窗口中輸入“psr.exe”并回車,這樣就可以打開“步驟記錄器”。
步驟記錄器以一個長方形的小窗口出現,不會占用太多的地方。
有“開始記錄”、“停止記錄”、“添加注釋”、“暫停記錄”、“恢復記錄”的按鈕。
操作完成后點擊“結束記錄”,會自動打開記錄內容,展示我們記錄的第一步、第二步的操作截圖及文字說明。
怎么樣,你學會了嗎?好了,今天就和大家分享到這里,我們下次再見~