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