說實話,第一眼看到這個問題,我被震住了,心想到底是什么樣的勇氣能讓題主竟然用base64編碼來處理大文件,這豈不自尋煩惱,所以對于這個問題,我的建議不是該如何解決base64編碼的大小問題,而是要換一種方式來存儲文件,比如用文件系統。
問題剖析
先來分析下這個問題的原因,一般搞開發的都知道base64編碼很大程度上是簡化了我們傳輸文件的方式,特別是對于沒有文件系統的團隊來說,更是難得,但是這里的文件僅僅指的是小文件、小圖片(如:頭像、二維碼等)之類的,因為大文件轉化出來的base64編碼真的很長很長,先說這不利于網絡傳輸,就算勉強傳輸過去了,數據庫也不見得能存儲下來,就算勉強存儲下來了,重新再獲取的時候也一定會影響速度和效率。
至于題主說的71M的問題,其實base64編碼出來的長度可能就不止71M了,因為base64要求把每三個8Bit的字節轉換為四個6Bit的字節(3*8 = 4*6 = 24),然后把6Bit再添兩位高位0,組成四個8Bit的字節,也就是說,轉換后的字符串理論上將要比原來的長1/3,對此,我特意在線編碼了一個大于71M的文件,感覺還是可以編碼的,只是速度是真的很慢,網頁都卡死了好幾回,不知道題主用的是哪門語言,可能不同語言間也會有差距。
解決方法
1、采用文件系統
對于大文件的存儲我還是提倡用文件系統來進行存儲,這樣的話就只要存儲文件路徑就好了,這樣不僅傳輸快,數據庫各方面也沒啥壓力,讀寫文件也很方便。
- 可能有的團隊覺得搭建文件系統很麻煩,并且也沒有多余的服務器來管理文件,如果是這樣的話,其實還可以考慮用云端的文件系統(如:阿里云OSS),這樣的話,我們存儲文件的時候就只要用它們接口將文件傳給云端,獲取文件的時候就只要調特定的接口獲取文件url即可。
2、將大文件切割成小文件
如果仍然是不想用文件系統的話,那就只好從源頭出發,把大文件切割成小文件,然后依次用base64編碼,還原的時候就先將base64編碼轉成對應的小文件, 然后不同的小文件再合成大文件。
切割的方式可以通過壓縮文件的方式,比如對一個31M的文件右擊 -> 添加到壓縮文件,下面會有一個分卷的地方,大小可以填小一點,如下圖所示:
然后點“確定”后就會生成3個小文件,如下圖所示:
合成文件就更簡單了,將這三個小文件右擊 -> 解壓到當前目錄或某一個目錄下就好了。
這種方法雖然也能達到目的,但是也看到了,這樣處理文件的代價是非常大的。
結束語
base64編碼雖然是個好東西,從一定程度上簡化了開發人員處理小文件的方式,但是卻不是通用的,所以我們在處理小文件上可以采用base64編解碼的方式,但是對于大文件來說還是建議使用文件系統的方式,這樣不僅對文件的管理更得體,也可以減少開發中遇到的不少問題。